原创博客地址:python进阶10并发之六并行化改造

图示变量含义说明:
1个大step中包含3个小step,大step内部的第一步,二步,三步存在依赖关系(就是内部保持顺序执行)
a1,b1,c1,表示子任务a的第一步,b的第一步,c的第一步.同理a2,表示子任务a的第二步。

无并行

水平并行

优点:修改简单,容易排错
缺点:使用场景有限,适合批量数据,不适合流式数据
实现:pool().map(step1);pool().map(step2);pool().map(step3)

垂直并行

优点:修改简单,容易排错
缺点:如果中间步骤耗时过多,上游依然处于限制状态
实现:pool().apply_sync(func(step1,step2,step3))

生产者消费者

优点:上下游耦合小,任务粒度更细
缺点:改造稍微复杂,需考虑生产者生成结束等特殊情况的兼容,并且调试也较麻烦
实现:Queue(多进程multiprocessing,Queue,多线程queue.Queue,python大多多进程)

协程

协成可看做特殊单线程(意味着本质是单线程,多线程是表象),任务角度多个线程同时执行,实时角度看只有一个线程真正执行,好处是无需处理线程共享数据的加锁等情况(因为只有一个线程会执行,不存在同时修改的情况)。还有就是其进程内部不需要操作系统调度(进程整体肯定是操作系统调度,否则就凌驾与操作系统了),会自行调度,释放时间片给其他内部线程。
常规的线程一旦得到cpu时间片,会毫不犹豫执行,哪怕处于sleep状态也会占用资源。而协程则不会,其会把cpu主动出让(给自己其他线程),等到别人”呼唤”自己时才会真正执行(比如next(自己),gevent.sleep时间到了也算唤醒)。
目前对协程的体会并不深,基本上就是循环改yield,然后外层通过next(send)触发不断的类似时序的执行(本博客前面有写过yield的专题,自行翻阅)。复杂协程也未写过,所以不做过多描述了,免得误人子弟。
关键词:yield,gevent

事件

优点:如果可以不同事件自动并行化(不确定python是否已实现),基本上生产者消费者所有优点都具备,并且,额外还有容易追溯,调试的好处.
缺点:程序架构需调整。改动最大.
实现:signal(python,django)
这个严格来说,并不属于并行范畴,但是将其放到这里,因为其和生产者消费者有共通之处,而且协程的实现底层也是基于事件模型。
生产者消费者存在很大问题,就是难以调试以及流程难以控制,由于切分粒度很细,并且不同步骤之间几乎独立,虽然可以保证整体的顺序执行以及最终任务可完成,但其上下游关系难以追溯,一旦出错也难以复现。所以个人很排斥生产者消费者这种方式。
而事件则不同,生产完成后将信息注册到事件链中,不但可以保存任务结束的result,还可以传递任务本身初始参数信息。每个事件都可以看做独立函数,即使某一个出错,也可以将事件参数作为debug锚点进行追踪。
django的事件模型用信号实现的,尚不确定是否是并发的。理论上来说,同类型事件应该可以串行,非同类事件并行,是比较稳妥的处理方式。但保不齐Python事件共享了同一事件通道。同时只执行一个事件,那样的话效率就未见得高了。

用事件的方式实现生产消费和协程效率应该类似,如果事件引擎支持多进程的话(不考虑GIL,多线程也行),那么效率会更高,毕竟协程只是单线程的。

python进阶10并发之六并行化改造相关推荐

  1. python进阶09并发之五生产者消费者

    原创博客地址:python进阶09并发之五生产者消费者 这也是实际项目中使用较多的一种并发模式,用Queue(JoinableQueue)实现,是Python中最常用的方式(这里的queue特指mul ...

  2. python进阶12并发之八多线程与数据同步

    原创博客地址:python进阶12并发之八多线程与数据同步 python并发首选进程,但偶尔有场景进程无法搞定,比如有些变量是无法序列化的,就无法使用工具包manager()的工具类进行共享.如果自己 ...

  3. python进阶11并发之七多种并发方式的效率测试

    原创博客地址:python进阶11并发之七多种并发方式的效率测试 测试map,apply_async,gevent协程爬虫 测试代码:网页爬虫 函数代码 1 2 3 4 5 6 7 8 9 10 11 ...

  4. python进阶08并发之四map, apply, map_async, apply_async差异

    原创博客地址: python进阶08并发之四map, apply, map_async, apply_async差异 差异矩阵 python封装了4种常用方法,用于实现并发 其差异如下   Multi ...

  5. python进阶10 MySQL补充 编码、别名、视图、数据库修改

    python进阶10 MySQL补充    编码.别名.视图.数据库修改 一.编码问题 #MySQL级别编码 #修改位置: /etc/mysql/mysql.conf.d/mysqld.cnf def ...

  6. python进阶07并发之三其他问题

    原创博客地址:python进阶07并发之三其他问题 何时使用多进程(线程) 使用多进程or线程,对于python,考虑到GIL锁,基本上默认使用多进程就对了. 除此之外,线程共享全局变量,进程全局变量 ...

  7. python进阶05并发之一基本概念

    原创博客地址:python进阶05并发之一基本概念 大多编程语言,一旦涉及并发,都会比较复杂,知识点也较多(大多为历史问题,很多技术点现在非常少使用了,但语言层面也提供支持,对于这些冷门点,只需要知道 ...

  8. python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发

    Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:

  9. 【视频课】10大真实金融量化交易案例,20多小时Python进阶课!

    Python是金融行业的重要工具,本次我们联合<王的机器>公众号号主一起推出Python金融案例进阶课程,并且基于10大金融行业的实际案例进行实践,下面请听介绍. 作者介绍 首先来介绍一下 ...

最新文章

  1. Python 匹配字符串开头内容与结尾内容(startswith与endswith)
  2. 1 张图,拆解阿里 P8高级架构师必会技术栈!
  3. 回调函数的意义以及python实现
  4. 让php4和php5共存的方法
  5. python每天定时9点执行_python定时器每天订时执行的实例方法
  6. 鸿蒙系统的适配国产手机,真正的好消息!其它国产机,也在适配华为鸿蒙系统...
  7. LNK2019无法解析的外部符号 public: static struct cv::Ptr class cv::xfeatures2d::SURF问题解决
  8. 用户行为变迁 行业垂直深耕——疫情下的2020年移动互联网报告
  9. 上传图片的表单java代码_java模拟post方式提交表单实现图片上传(示例代码)
  10. ads出现村田电容电感无法仿真的问题解决(`BJT1' is an instance of an undefined model `BJTM1')...
  11. 并发控制技术手段之多版本(三)
  12. 道德如果一直在滑坡,终会酿成大祸,历朝历代,莫过于是……
  13. 33. Avoid Hiding inerited names
  14. atitit.软件开发概念--过滤和投影 数据操作
  15. eplan p8详细安装步骤文库_eplan p8详细安装步骤
  16. Linux内核学习路线 学习linux内核的建议
  17. 常用的Sql命令之造数据
  18. 服务器怎么使自己的文件夹加密,NAS中如何创建和使用加密文件夹
  19. threejs-自定义着色器材质
  20. Qt编写安防视频监控系统13-视频存储

热门文章

  1. 华硕固件,梅林固件,高恪固件等等有什么区别?
  2. I/O设备的基本概念和分类
  3. t-sql 使用正则表达式_如何在T-SQL查询中使用可扩展表达式; 性能优势和实例
  4. sql server 群集_设计有效SQL Server群集索引
  5. MYSQL小函数大用途之-------FIND_IN_SET
  6. 从0搭建一个用户成长体系,你需要知道的都在这了
  7. [bzoj1086][SCOI2005]王室联邦
  8. RESTful API标准设计教程
  9. [AaronYang]C#人爱学不学[1]
  10. 快速排序的递归方式和非递归方式