[ 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() させた場合はネイティブスレッドになるようですね。
| 固定リンク
この記事へのコメントは終了しました。


コメント