[ python ] Threading で作成されるスレッドはネイティブスレッド
とある人から「Python では Thread / threading モジュールをを使ったとしても、ネイティブマルチスレッドアプリは作れない」と聞いていたのですが、少なくとも、Win32 環境においてはネイティブスレッドになるようです。
havana の発言: あれ havana の発言: Pythonはネイティブスレッド使ってるって havana の発言: 書いてあるけど。 havana の発言: おお? fomalhaut の発言: いや fomalhaut の発言: そんなことないはずだけど・・・ fomalhaut の発言: threading つかってみ? havana の発言: http://0xcc.net/blog/archives/000099.html havana の発言: なまずのひととか havana の発言: んー。 havana の発言: どうなんでしょう havana の発言: ソース読めば解るな havana の発言: ごそごそ fomalhaut の発言: (´・ω・`) havana の発言: Pythonの実装見てきたー havana の発言: やっぱりthreadingのなかでthreadってモジュールを使ってて havana の発言: threadの実装がプラットホーム毎に fomalhaut の発言: うん havana の発言: ネイティブスレッドでスレッドを実現する仕組み。 fomalhaut の発言: thread が低レイヤーのスレッド実装 fomalhaut の発言: ? fomalhaut の発言: や fomalhaut の発言: thread 使っても fomalhaut の発言: ネイティブスレッドにはならんらしいぞ havana の発言: PyThread_start_new_thread(void (*func)(void *), void *arg) { Py_uintptr_t rv; callobj obj; dprintf(("%ld: PyThread_start_new_thread called\n", PyThread_get_thread_ident())); if (!initialized) PyThread_init_thread(); obj.id = -1; /* guilty until proved innocent */ obj.func = func; obj.arg = arg; obj.done = CreateSemaphore(NULL, 0, 1, NULL); if (obj.done == NULL) return -1; havana の発言: rv = _beginthread(bootstrap, _pythread_stacksize, &obj); havana の発言: ってなってるけど。 havana の発言: pthread実装とかもあるし。 havana の発言: んー havana の発言: _beginthreadはWin32のスレッド開始めいれいだぬ havana の発言: http://msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx havana の発言: はて。 fomalhaut の発言: (´・ω・`) havana の発言: あとはネイティブスレッドでない場合 havana の発言: インタプリタ側でスケジューリングしないと成らないけど havana の発言: それぽいところがみあたらん。 fomalhaut の発言: なるほど havana の発言: うむ havana の発言: ためしにPythonでタイマ100個つくってみたが havana の発言: ネイティブスレッドが101個できたよ havana の発言: 1個インタプリタのスレッドだぬ havana の発言: Win32の話なので havana の発言: 他だとどうなるかは知らん。
CPython インタープリタのソースコードを見る限りでは Thread / threading モジュールを使ってスレッドオブジェクトを作成してそれを run() させた場合はネイティブスレッドになるようですね。
| 固定リンク
この記事へのコメントは終了しました。
コメント