使用multiprocessing模块在Python中控制独立进程

3 投票
1 回答
831 浏览
提问于 2025-04-18 08:30

我想知道在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

撰写回答