2
マルチプロセッシングでスレッドがなぜ機能しないのか説明できますか?Python、マルチプロセッシングでスレッドを使用する
私の問題を説明するための例を添付しました。
私は毎秒実行してファイルに書き込むプロセスを持っています。シェルから実行すると、期待通りに動作します。
stat_collect.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from threading import Timer
from os import path
from datetime import datetime
STAT_DATETIME_FMT = '%Y-%m-%d %H:%M:%S'
def collect_statistics():
my_file = 'test.file'
if not path.exists(my_file):
with open(my_file, 'w') as fp:
fp.write(datetime.now().strftime(STAT_DATETIME_FMT) + '\n')
else:
with open(my_file, 'a') as fp:
fp.write(datetime.now().strftime(STAT_DATETIME_FMT) + '\n')
Timer(1, collect_statistics).start()
if __name__ == '__main__':
collect_statistics()
私は(バックグラウンドで動作するように)他のスクリプトから、それを実行しよう:一度だけ実行
#!/usr/bin/env python
from multiprocessing import Process
from stat_collect import collect_statistics # logger sc
if __name__ == '__main__':
# This don't work
p = Process(target=collect_statistics)
p.start()
while True:
pass
方法collect_statisticsが、私はスレッドを使用している場合(target = collect_statistics).start()シェルから実行するかのように動作します。なぜこれが起こるのですか?ここで
したがって、プロセスの呼び出しは、コマンドラインからstat_collect.pyを実行するのと同じではありませんか?そして、なぜプロセスから実行していて、コマンドラインからスクリプトを実行するときにタイマーが殺されないのか、タイマーが殺されているのですか? – Ilya
Pythonの[GIL](http://www.dabeaz.com/python/UnderstandingGIL.pdf)を見てください。基本的にはPythonでは、2つのプロセスはまったく通信しません。コマンドラインから実行すると、コードが単一のプロセスで実行され、すべての変数( 'Timer')は「共有」されます。別のプロセス内で実行すると、親プロセス(呼び出しスクリプト)と子プロセス( 'p = Process(...)'で作成されます)が作成されます。親プロセスは子プロセスと通信することはなく、別のスレッドが起動されたことを知らない。 – CoMartel