Pythonでもマルチスレッドとマルチプロセスの共存は厳禁ですか?
マルチプロセスとマルチスレッドについて調べていると、デッドロックの危険があるので混在させるのはfork()後即exec()させる場合を除いて厳禁といった趣旨の記事がいくつか見当たりました。
http://d.hatena.ne.jp/yupo5656/20040715/p1
https://docs.oracle.com/cd/E19455-01/806-2732/6jbu8v6p4/index.html
記事の理屈はよくわかるのですが、これはPythonのthreading.Threadとmultiprocessing.Processの場合でも同様なのでしょうか?
[Kenji Noguchiさんのコメントを受けての追記]
下記のテストコードを試してみました。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
from multiprocessing import Process
def other_proc_func(name):
while True:
time.sleep(1)
print('Hello {}'.format(__name__))
if __name__ == '__main__':
for i in range(10):
name = 'Proc{}'.format(i)
p = Process(target=other_proc_func, args=[name])
p.deamon = True
p.start()
while True:
pass
この時、print('Hello {}'.format(__name__))
はプロセスを生成した回数分呼び出されました(__name__ == '__main__'
なのは初めの一回のみ)。別のモジュールからプロセスを生成した場合でも、トップレベルのモジュールから再実行が行われていました。
Python側がProcess.targetの関数を呼び出す際に、fork()でプロセスのコピーを行った後に、exec()でPythonを再実行しているように見えます。
これは参考文献にある、"意訳: fork()してライブラリ関数を呼び出さずにexec()すればOK"というケースに該当しそうに思うのですが、どうなのでしょうか?Pythonのソースコードを当たるべきかもしれませんが。