赞
踩
在公司项目开发过程中遇到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
侵告删
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。