经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
对Python3之进程池与回调函数的实例详解
来源:jb51  时间:2019/1/23 9:07:31  对本文有异议

进程池

代码演示

方式一

  1. from multiprocessing import Pool
  2.  
  3.  
  4. def deal_task(n):
  5. n -= 1
  6. return n
  7.  
  8.  
  9. if __name__ == '__main__':
  10. n = 10
  11. p = Pool(4)
  12. for i in range(4):
  13. res = p.apply(deal_task, args=(n,))
  14. #调用apply是一个串行的效果,任务会被进程一个一个的处理,直接得到结果
  15. #前提是执行的任务必须要有返回值
  16. print(res)

方式二

  1. from multiprocessing import Pool
  2.  
  3.  
  4. def deal_task(n):
  5. n -= 1
  6. return n
  7.  
  8.  
  9. if __name__ == '__main__':
  10. n = 10
  11. p = Pool(4)
  12. obj_l = []
  13. for i in range(4):
  14. #调用apply_async会返回一个对象,主进程会不断扔任务给线程池,让子线程处理
  15. obj = p.apply_async(deal_task, args=(n,))
  16. obj_l.append(obj)
  17. #首先函数要有返回值
  18. #调用close目的是防止join期间会有别的任务被添加到任务列表中
  19. #不调用close会报错
  20. p.close()
  21. p.join()
  22. #join是要让子进程全部处理完之后得到结果统一处理,还有一个非常重要的原因是进程池依附于主进程,主进程结束,进程池消失。进程池的任务没有被处理程序就结束了。
  23. for obj in obj_l:
  24. print(obj.get())

方式三

  1. from multiprocessing import Pool
  2.  
  3. import requests
  4.  
  5.  
  6. def get_page(url):
  7. ret = requests.get(url).text
  8. return {'url': url, 'ret': ret}
  9.  
  10.  
  11. def parse_page(ret):
  12. with open('ab.txt', 'a') as f:
  13. f.write('%s - %s\n' % (ret['url'], len(ret['ret'])))
  14.  
  15.  
  16. if __name__ == '__main__':
  17. urls = [
  18. 'https://www.baidu.com',
  19. 'http://www.openstack.org',
  20. 'https://www.python.org',
  21. 'https://help.github.com/',
  22. 'http://www.sina.com.cn/'
  23. ]
  24. p = Pool()
  25. for url in urls:
  26. #使用回调函数,当get_page下载完后,主线程调用parse_page自动处理get_page下载的结果,节省了parse_page的时间,该场景用于一个函数为耗时操作并且产生数据,另一个函数是非耗时操作,这样就节省了非耗时操作函数的时间
  27. p.apply_async(get_page, args=(url,), callback=parse_page)
  28.  
  29. p.close()
  30. p.join()
  31. print('主')

join是要让子进程全部处理完之后得到结果统一处理,还有一个非常重要的原因是进程池依附于主进程,主进程结束,进程池消失。进程池的任务没有被处理程序就结束了。

以上这篇对Python3之进程池与回调函数的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号