マルチプロセッシングモジュールを使用してPythonで別のプロセスを制御します

StackOverflow https://stackoverflow.com//questions/24026968

質問

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
.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top