我想知道能够控制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')
如果需要,我可以提供尝试创建此类脚本失败的代码示例。但基本上我想知道一种实现我所拥有的方法的方法,如果该方法使用全局变量作为信号,它也会很棒。我知道我不能,因为新流程不会分享全球状态...
这就是全部。
答案 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