使用multiprocessing模块在Python中控制独立进程
我想知道在Python中,如何最简单地控制由主函数启动的一个进程。
举个例子,在我的主循环里,我调用一个函数,这个函数会作为一个独立的进程运行,它的唯一目的是把数据收集到一个缓冲区。然后,每当我想要的时候,我会告诉这个进程停止收集数据,并把数据存储到一个文本文件里。等它写完文件后,我希望它能等待来自主函数的另一个信号,然后再开始同样的循环,也就是收集新的数据到缓冲区。这个过程会无限重复,不过如果我能在想要新数据之前实际停止这个进程,那就太好了。
我试过使用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 个回答
2
你的代码看起来不错。我建议在父进程中创建一个 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