Python3与C#并发编程之 上篇

大家这么急,那就先推Net的,Python过几天再推

其实逆天现在Coding已经是80%变成Python了,20%才是Net,也不确定是否一直在Net界干下去,所以只能尽可能的在说新知识的同时,尽量把脑子里面Net相关的内容教给大家,万一跨行业也算对得起大家的厚爱了(这个我从来不强求,反正什么编程语言都一样,顺其自然~)

NetCore并发编程

示例代码:https://github.com/lotapp/BaseCode/tree/master/netcore/4_Concurrency

先简单说下概念(其实之前也有说,所以简说下):

并发:同时做多件事情

多线程:并发的一种形式

并行处理:多线程的一种(线程池产生的一种并发类型,eg:异步编程

响应式编程:一种编程模式,对事件进行响应(有点类似于JQ的事件)

Net里面很少用进程,在以前基本上都是

我这边简单引入一下,毕竟主要是写Python的教程,Net只是帮你们回顾一下,如果你发现还没听过这些概念,或者你的项目中还充斥着各种 和 的话,真的得系统的学习一下了,现在官网的文档已经很完善了,记得早几年啥都没有,也只能挖那些外国开源项目:

https://docs.microsoft.com/zh-cn/dotnet/standard/parallel-processing-and-concurrency

1.异步编程(Task)

Task的目的其实就是为了简化 和 的代码,下面一起看看吧:

异步用起来比较简单,一般IO,DB,Net用的比较多,很多时候都会采用重试机制,举个简单的例子:

然后补充说下Task异常的问题,当你await的时候如果有异常会抛出,在第一个await处捕获处理即可

如果 和 就是理解不了的可以这样想: 就是为了让 生效(为了向后兼容)

对了,如果返回的是void,你设置成Task就行了,触发是类似于事件之类的方法才使用void,不然没有返回值都是使用Task

项目里经常有这么一个场景:等待一组任务完成后再执行某个操作,看个引入案例:

再举一个场景:同时调用多个同效果的API,有一个返回就好了,其他的忽略

一个async方法被await调用后,当它恢复运行时就会回到原来的上下文中运行。

如果你的Task不再需要上下文了可以使用: ,eg:写个日记还要啥上下文?

逆天的建议是:在核心代码里面一种使用 ,用户页面相关代码,不需要上下文的加上

其实如果有太多await在上下文里恢复那也是比较卡的,使用 之后,被暂停后会在线程池里面继续运行

再看一个场景:比如一个耗时操作,我需要指定它的超时时间:

异步这块简单回顾就不说了,留两个扩展,你们自行探讨:

进度方面的可以使用 ,就当留个作业自己摸索下吧~

使用了异步之后尽量避免使用 or ,这样可以避免死锁

Task其他新特征去官网看看吧,引入到此为止了。

2.并行编程(Parallel)

这个其实出来很久了,现在基本上都是用 比较多点,主要就是:

数据并行:重点在处理数据(eg:聚合)

任务并行:重点在执行任务(每个任务块尽可能独立,越独立效率越高)

数据并行

以前都是 这么用,现在和Linq结合之后非常方便 就OK了

说很抽象看个简单案例:

正常执行的结果应该是:

并行之后就是这样了(不管顺序了):

当然了,如果你就是对顺序有要求可以使用:

其实实际项目中,使用并行的时候:任务时间适中,太长不适合,太短也不适合

记得大家在项目里经常会用到如 , 等聚合函数,其实这时候使用并行就很合适

time dotnet PLINQ.dll

不使用并行:(稍微多了点,CPU越密集差距越大)

其实聚合有一个通用方法,可以支持复杂的聚合:(以上面sum为例)

稍微扩展一下,PLinq也是支持取消的,

Token的用法和上面一样,就不复述了,如果需要和异步结合,一个 就可以把并行任务交给线程池了

也可以使用Task的异步方法,设置超时时间,这样PLinq超时了也就终止了

PLinq这么方便,其实也是有一些小弊端的,比如它会直接最大程度的占用系统资源,可能会影响其他的任务,而传统的Parallel则会动态调整

任务并行(并行调用)

这个PLinq好像没有对应的方法,有新语法你可以说下,来举个例子:

取消也支持:

扩充说明

其实还有一些比如数据流响应编程没说,这个之前都是用第三方库,刚才看官网文档,好像已经支持了,所以就不卖弄了,感兴趣的可以去看看,其实项目里面有流数据相关的框架,eg: ,都是比较成熟的解决方案了基本上也不太使用这些了。

然后还有一些没说,比如NetCore里面不可变类型(列表、字典、集合、队列、栈、线程安全字典等等)以及限流任务调度等,这些关键词我提一下,也方便你去搜索自己学习拓展

先到这吧,其他的自己探索一下吧,最后贴一些Nuget库,你可以针对性的使用:

数据流响应编程(Linq的Rx操作):不可变类型

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180804G163AP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券