マルチプロセッシングモジュールを使用してPythonで別のプロセスを制御します
-
21-12-2019 - |
質問
Pythonの主な関数によって始動されたプロセスを制御できる最も簡単な方法は何であるか疑問に思います。
例えば、マイメインループでは、別のプロセスになる関数を呼び出し、その唯一の目的はバッファにデータを収集することです。それから私が望むときはいつでも、私はそのプロセスにデータの収集を停止し、それをテキストファイルに格納します。その後、ファイルへの書き込みが完了したら、もう一度同じループを開始する前に別の信号(メインから来る)を待ちます。つまり、新しいデータをバッファに収集します。新しいデータが必要なまで実際にプロセスを停止する能力がある場合、プロセスは無期限に繰り返されます。 multiprocessing.event()を使用してみましたが、i event.set()またはimplice()のときにメッセージが時間内に受信されず、データフォーマットがねじ込まれていることがあります。
例:
def separateProcess():
datBuffer = []
while True:
datBuffer.append(collectData(sample))
if signal.recv == 'TimeToWriteToFile':
#Write the data buffer to file.
while True:
if signal.recv == 'NewData':
#Signal to begin recording new data has been received
datBuffer = [] #clear the buffer for new data.
break
else:
#Continue recording Data.
pass
def main():
#This code will do some stuff regarding the experiment.
p = mp.Process(target=separateProcess)
p.start()
#Based on a particular event I will send the signal when needed.
if experiment == 'Success':
sendToProc('TimeToWriteToFile') #Theoretical signal to the other process.
sleep(10) #Wait for X amount of seconds then begin recording new data.
sendToProc('NewData')
.
必要に応じて、このようなスクリプトを作成することに失敗した試みのコードサンプルを提供できます。しかし基本的に私は私がそこに持っているものを達成するための方法を知りたいと思います。そのメソッドがグローバル変数をシグナルとして機能していた場合も素晴らしいでしょう。私は新しいプロセスがグローバル状態を共有しないので私は知っています...
それはすべてです。
解決
あなたのコードはかなり良いようです。親プロセスでQueue
を作成してから、データを出力します。親プロセスが労働者に死ぬことを望んでいるとき、None
を送信します。
ソース
import multiprocessing, Queue
def myproc(arg):
return arg*2
def worker(inqueue):
for num in iter(inqueue.get, None):
print myproc(num)
inq = multiprocessing.Queue()
# prefill with 3 jobs
for num in range(3):
inq.put(num)
# signal end of jobs
inq.put(None)
worker_p = multiprocessing.Process(
target=worker, args=(inq,),
)
worker_p.start()
worker_p.join()
.
出力
0
2
4
. 所属していません StackOverflow