Python3 加C #并发编程!强强组合!会产生什么样的化学反应?
1.进程篇 官方文档:https://docs.python.org/3/library/multiprocessing.html 1.1.进程(Process) Python的进程创建非常方便,看个案例:(这种方法通用,fork只适用于Linux系) 进群:548377875 ? 即可获取数十套PDF哦! 其他参数可以参考源码 or 文档,贴一下源码的 init方法: def__init__(self,group=None,target=None,name=None,args=(),kwargs={},*,daemon=None) 扩展: name:为当前进程实例的别名
上面的案例如果用OOP来实现就是这样:(如果不指定方法,默认调Run方法) 1.1.源码拓展 现在说说里面的一些门道(只像用的可以忽略) 新版本的封装可能多层,这时候可以看看Python3.3.X系列(这个算是Python3早期版本了,很多代码都暴露出来,比较明了直观) 关于断言的简单说明:(别泛滥) 如果条件为真,它什么都不做,反之它触发一个带可选错误信息的AssertionError 1.2.进程池 多个进程就不需要自己手动去管理了,有Pool来帮你完成,先看个案例: 图示:(join可以指定超时时间,eg: p.join(1)) 调用 join()之前必须先调用 close(),调用 close()之后就不能继续添加新的 Process了 1.3.源码拓展 验证一下Pool的默认大小是CPU的核数,看源码: multiprocessing.pool.py 来看个例子:(和JQ很像) 大家这么急,那就先推Net的,Python过几天再推 其实逆天现在Coding已经是80%变成Python了,20%才是Net,也不确定是否一直在Net界干下去,所以只能尽可能的在说新知识的同时,尽量把脑子里面Net相关的内容教给大家,万一跨行业也算对得起大家的厚爱了(这个我从来不强求,反正什么编程语言都一样,顺其自然~) NetCore并发编程 示例代码:https://github.com/lotapp/BaseCode/tree/master/netcore/4_Concurrency 先简单说下概念(其实之前也有说,所以简说下): 然后补充说下Task异常的问题,当你await的时候如果有异常会抛出,在第一个await处捕获处理即可 如果 async和 await就是理解不了的可以这样想: async就是为了让 await生效(为了向后兼容) 一个async方法被await调用后,当它恢复运行时就会回到原来的上下文中运行。 如果你的Task不再需要上下文了可以使用: task.ConfigureAwait(false),eg:写个日记还要啥上下文? 逆天的建议是:在核心代码里面一种使用 ConfigureAwait,用户页面相关代码,不需要上下文的加上 其实如果有太多await在上下文里恢复那也是比较卡的,使用 ConfigureAwait之后,被暂停后会在线程池里面继续运行 再看一个场景:比如一个耗时操作,我需要指定它的超时时间: 异步这块简单回顾就不说了,留两个扩展,你们自行探讨:
Task其他新特征去官网看看吧,引入到此为止了。 2.并行编程(Parallel) 这个其实出来很久了,现在基本上都是用 PLinq比较多点,主要就是:
数据并行 以前都是 Parallel.ForEach这么用,现在和Linq结合之后非常方便 .AsParallel()就OK了 说很抽象看个简单案例: 当然了,如果你就是对顺序有要求可以使用:?.AsOrdered() 不使用并行:(稍微多了点,CPU越密集差距越大)
其实聚合有一个通用方法,可以支持复杂的聚合:(以上面sum为例)
稍微扩展一下,PLinq也是支持取消的,?.WithCancellation(CancellationToken) Token的用法和上面一样,就不复述了,如果需要和异步结合,一个 Task.Run就可以把并行任务交给线程池了 也可以使用Task的异步方法,设置超时时间,这样PLinq超时了也就终止了 PLinq这么方便,其实也是有一些小弊端的,比如它会直接最大程度的占用系统资源,可能会影响其他的任务,而传统的Parallel则会动态调整 任务并行(并行调用) 这个PLinq好像没有对应的方法,有新语法你可以说下,来举个例子: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |