使用多处理模块在python中控制一个单独的进程

时间:2014-06-04 00:07:58

标签: python multiprocessing python-multithreading

我想知道能够控制python中main函数启动的进程的最简单方法是什么。

例如,在我的主循环中,我调用一个函数,该函数将是一个单独的进程,其唯一目的是将数据收集到缓冲区。然后,只要我想,我将指示该过程停止收集数据并将其存储在文本文件中。然后,当它完成对文件的写入时,我希望它在再次启动相同的循环之前等待另一个信号(来自main),即将新数据收集到缓冲区。这个过程将无限期地重复,但如果我有能力实际停止该过程直到我想要新数据,那将是非常棒的。 我尝试使用multiprocessing.Event()但由于某种原因,当我在event.set()或event.clear()时,有时候没有及时收到消息,因此数据格式化了。

示例:

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')

如果需要,我可以提供尝试创建此类脚本失败的代码示例。但基本上我想知道一种实现我所拥有的方法的方法,如果该方法使用全局变量作为信号,它也会很棒。我知道我不能,因为新流程不会分享全球状态...

这就是全部。

1 个答案:

答案 0 :(得分:2)

你的代码看起来很不错。我建议在父进程中创建一个Queue,然后向您的工作人员发送任何内容,然后输出数据。当父proc希望工人死亡时,发送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