Python 之 异步进程回调函数(callback())

摘要:

在公司项目开发过程中遇到multiprocessing,打算进一步了解一下multiprocessing的多线程、多进程和协程方便后续的开发,无意中看到异步进程回调函数(callback()),正好运用在项目中的某个之前想要优化的模块,于是写了这篇博客

需要回调函数的场景:

进程池中任何一个任务一旦处理完了,就立即告知主进程:我好了,你可以处理我的结果了。主进程则调用一个函数去处理该结果,该函数即回调函数。我们可以把耗时间(阻塞)的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程在执行回调函数时就省去了I/O的过程,直接拿到的是任务的结果。

代码:

from multiprocessing import Process,Pool
import os
import time
import random

#子进程任务
def download(f):
    print('__进程池中的进程——pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
    for i in range(3):
        print(f,'--文件--%d'%i)
        time.sleep(random.randint(1, 9))
        # time.sleep(1)
    return {"result": 1, "info": '下载完成!'}

#主进程调用回调函数
def alterUser(msg):
    print("----callback func --pid=%d"%os.getpid())
    print("get result:", msg["info"])

if __name__ == "__main__":
    p = Pool(3)
    p.apply_async(func=download, args=(1111,), callback=alterUser)
    p.apply_async(func=download, args=(2222,), callback=alterUser)
    p.apply_async(func=download, args=(3333,), callback=alterUser)
    #当func执行完毕后,return的东西会给到回调函数callback
    print("---start----")
    p.close()#关闭进程池,关闭后,p不再接收新的请求。
    p.join()
    print("---end-----")

输出:

---start----
__进程池中的进程——pid=1316,ppid=5880
1111 --文件--0
__进程池中的进程——pid=11372,ppid=5880
2222 --文件--0
__进程池中的进程——pid=8156,ppid=5880
3333 --文件--0
2222 --文件--1
3333 --文件--1
1111 --文件--1
2222 --文件--2
----callback func --pid=5880
get result: 下载完成!
3333 --文件--2
----callback func --pid=5880
get result: 下载完成!
1111 --文件--2
----callback func --pid=5880
get result: 下载完成!
---end-----

 

参考:https://www.cnblogs.com/surehunter/p/7896298.html

           https://blog.csdn.net/zbrj12345/article/details/79792483

侵告删

你可能感兴趣的:(python拓展)