繁体   English   中英

对主进程的多处理回调 - Python

[英]Multiprocessing Callbacks to Main Process - Python

有没有办法使用多处理从创建的进程回调主进程? 假设我有 main.py,它使用 multiprocessing 创建三个进程,如下所示

from multiprocessing import Process
from child import createNewProcess

def callbackFunction(data):
   print(data)

if __name__ == "__main__"
   process = []
   for i in range(3):
        p = Process(target=createNewProcess, args=(callback,))
        process.append(p)
   [x.start() for x in process]

child.py 看起来像

def createNewProcess(externalCB):
    # do something and call external callback
    data = 10 + 12
    externalCB(data)

我想调用 callbackFunction() ,它在创建的进程的主进程上下文中可用。 但在上面的例子中,它在自己的进程中创建了三个新的 callbackFunction() 对象,并调用在自己的上下文中的对象。

如何使用多处理进程调用主 callbackFunction() 上下文?

使用队列传递适当回调的示例代码段,并将数据返回到主进程上的线程:

from multiprocessing import Process, Queue, current_process
from threading import Thread
from time import sleep

def foo_process(data, cb_queue, cb):
    print(f"data from process [{current_process().pid}]: {data}")
    sleep(.1) # time to flush stdout so print statement is usually in correct order
              # (may still be out of order on IPython)
    cb_queue.put((cb, data))

def foo_thread(data):
    print(f"data from cb_thread in process [{current_process().pid}]: {data*2}")

def callback_caller(cb_queue):
    for func, *args in iter(cb_queue.get, None): #pass None to exit thread
        func(*args)

if __name__ == "__main__":
    print(f"main pid: [{current_process().pid}]")
    q = Queue()

    p = Process(target=foo_process, args=(3.15, q, foo_thread))
    p.start()
    
    #It's advisable (if possible) to always create processes first then threads.
    #this primarily applies to using "fork", but it's good to know / good habit.
    t = Thread(target=callback_caller, args=(q,))
    t.start()

    p.join()

    q.put(None) #send shutdown signal to callback_caller
    t.join()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM