そのため、私は Python でスレッドとプロセスを操作してきましたが、その過程で、名前による RPC を使用して状態データを失うことなく、スレッドやプロセス間で同じクラスを前後にピッチングできるパターンを作成しました。呼び出しとパイプ。
すべてが正常に動作しますが、ピクルされたファイルから状態をロードする場合と比較して、プロセスを開始するのに途方もない時間がかかり、Thread.start() はすぐに戻るため、コンストラクターのわずかなコストしかありません。だから:ばかげた起動時間なしで大きな初期状態で Process を開始する最良の方法は何ですか。以下の抜粋とデバッグ出力。「カウンター」のサイズは、モード 2 でファイルにピクルされた 34,000K をわずかに超えています。
...
elif command == "load":
# RPC call - Loads state from file "pickle_name":
timestart = time.time()
print do_remote("take_pickled_state", pickle_name)
print "Load cost: " + str(time.time() - timestart)
elif command == "asproc":
if type(_async) is multiprocessing.Process:
print "Already running as a Process you fool!."
else:
do_remote("stop")
_async.join()
p_pipe.close()
p_pipe, c_pipe = multiprocessing.Pipe()
timestart = time.time()
_async = multiprocessing.Process(target = counter, args = (c_pipe,))
# Why is this so expensive!!?!?!?! AAARRG!!?!
_async.start()
print "Start cost: " + str(time.time() - timestart)
elif command == "asthread":
if type(_async) is threading.Thread:
print "Already running as a Thread you fool!."
else:
# Returns the state of counter on stop:
timestart = time.time()
counter = do_remote("stop")
print "Proc stop time: " + str(time.time() - timestart)
_async.join()
p_pipe.close()
p_pipe, c_pipe = multiprocessing.Pipe()
timestart = time.time()
_async = threading.Thread(target = counter, args = (c_pipe,))
_async.start()
print "Start cost: " + str(time.time() - timestart)
...
対応するデバッグ ステートメント:
Waiting for command...
>>> load
Load complete.
Load cost: 2.18700003624
Waiting for command...
>>> asproc
Start cost: 23.3910000324
Waiting for command...
>>> asthread
Proc stop time: 0.921999931335
Start cost: 0.0629999637604
編集 1: OS: Win XP 64。Python バージョン: 2.7.x プロセッサ: Xeon クアッド コア。
編集2:私が本当に得られないのは、プロセス停止が状態全体を返すのに約1秒かかることですが、状態を受け取って開始するには20倍長くかかります. (デバッグ出力を追加)