

マルチプロセスとマルチスレッドについて調べていると、デッドロックの危険があるので混在させるのは`fork()`後即`exec()`させる場合を除いて厳禁といった趣旨の記事がいくつか見当たりました。

  * [UNIX上でのC++ソフトウェア設計の定石 (3)](https://yupo5656.hatenadiary.org/entry/20040715/p1)

  * [プロセスの生成 − fork (マルチスレッドのプログラミング)](https://docs.oracle.com/cd/E19455-01/806-2732/6jbu8v6p4/index.html)

記事の理屈はよくわかるのですが、これはPythonの`threading.Thread`と`multiprocessing.Process`の場合でも同様なのでしょうか？

* * *

**[Kenji Noguchiさんのコメントを受けての追記]**  
下記のテストコードを試してみました。

[code]

    #!/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
    
[/code]

この時、`print('Hello {}'.format(__name__))`はプロセスを生成した回数分呼び出されました(`__name__ ==
'__main__'`なのは初めの一回のみ)。別のモジュールからプロセスを生成した場合でも、トップレベルのモジュールから再実行が行われていました。  
Python側が`Process.target`の関数を呼び出す際に、`fork()`でプロセスのコピーを行った後に、`exec()`でPythonを再実行しているように見えます。

これは参考文献にある、"意訳:
`fork()`してライブラリ関数を呼び出さずに`exec()`すればOK"というケースに該当しそうに思うのですが、どうなのでしょうか？Pythonのソースコードを当たるべきかもしれませんが。


CC BY-SA 4.0
2017-06-22T15:35:00.180
35818
2020-09-11T16:21:01.263
2020-09-11T16:21:01.263
3060
17238
question
python
Pythonでもマルチスレッドとマルチプロセスの共存は厳禁ですか？