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:为当前进程实例的别名

  1. p.is_alive() 判断进程实例p是否还在执行
  2. p.terminate() 终止进程(发 SIGTERM信号)

上面的案例如果用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之后,被暂停后会在线程池里面继续运行

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

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

  1. 进度方面的可以使用 IProgress<T>,就当留个作业自己摸索下吧~
  2. 使用了异步之后尽量避免使用 task.Wait or task.Result,这样可以避免死锁

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



2.并行编程(Parallel)

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

  1. 数据并行:重点在处理数据(eg:聚合)
  2. 任务并行:重点在执行任务(每个任务块尽可能独立,越独立效率越高)

数据并行

以前都是 Parallel.ForEach这么用,现在和Linq结合之后非常方便 .AsParallel()就OK了

说很抽象看个简单案例:

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

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

  1. 499999500000
  2. real
  3. 0m0.103s
  4. user
  5. 0m0.092s
  6. sys
  7. 0m0.021s

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

  1. .
  2. Aggregate
  3. (
  4. seed
  5. :
  6. 0
  7. ,
  8. func
  9. :(
  10. sum
  11. ,
  12. item
  13. )=>
  14. sum
  15. +
  16. item
  17. );

稍微扩展一下,PLinq也是支持取消的, .WithCancellation(CancellationToken)

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

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

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



任务并行(并行调用)

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

原文地址:https://www.cnblogs.com/Python1314/p/9459989.html

时间: 2024-10-12 07:04:23

Python3 加C# 并发编程!强强组合!会产生什么样的化学反应?的相关文章

Python3 与 C# 并发编程之~ 进程先导篇

Linux专项¶ 先写几个问号来概况下今天准备说的内容:(谜底自己解开,文中都有) 你知道Ctrl+C终止进程的本质吗?你知道Kill -9 pid的真正含义吗? 你知道那些跨平台框架(Python,NetCore)在Linux下创建进程干了啥? 你了解僵尸进程和孤儿进程的悲催生产史吗?孤儿找干爹,僵尸送往生想知道不? 想知道创建子进程后怎么李代桃僵吗?ps aux | grep xxx的背后到底隐藏了什么? 你了解Linux磁盘中p类型的文件到底是个啥吗? 为什么要realase发布而不用de

Python3 与 C# 并发编程之~ 上篇

NetCore并发编程 示例代码:https://github.com/lotapp/BaseCode/tree/master/netcore/4_Concurrency 先简单说下概念(其实之前也有说,所以简说下): 并发:同时做多件事情 多线程:并发的一种形式 并行处理:多线程的一种(线程池产生的一种并发类型,eg:异步编程) 响应式编程:一种编程模式,对事件进行响应(有点类似于JQ的事件) Net里面很少用进程,在以前基本上都是线程+池+异步+并行+协程 我这边简单引入一下,毕竟主要是写P

Python3快速入门(九)——Python3并发编程

Python3快速入门(九)--Python3并发编程 一.Python线程模块 1.线程简介 一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,与进程内的其它线程共享进程的所有资源.一个进程中至少有一个线程,并作为程序的入口,即主线程,其它线程称为工作线程.???? 多线程,是指从软件或者硬件上实现多个线程并发执行的技术.支持多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,进而提升

Python3 网络编程和并发编程总结

目录 网络编程 开发架构 OSI七层模型 socket subprocess 粘包问题 socketserver TCP UDP 并发编程 多道技术 并发和并行 进程 僵尸进程和孤儿进程 守护进程 互斥锁 队列 IPC进程间通信 生产者与消费者模型 线程 GIL 多线程与多进程的选择 死锁 递归锁 信号量 线程队列 event事件 进程池与线程池 协程 gevent IO模型 网络编程 开发架构 B/S: browser/server C/S: client/server OSI七层模型 应用层

[Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合

根据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:

python-学习-python并发编程之多进程与多线程

一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.Python提供了multiprocessing.    multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似.  multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,

《C++ 并发编程》- 第1章 你好,C++的并发世界

<C++ 并发编程>- 第1章 你好,C++的并发世界 转载自并发编程网 – ifeve.com 本文是<C++ 并发编程>的第一章,感谢人民邮电出版社授权并发编程网发表此文,版权所有,请勿转载.该书将于近期上市. 本章主要内容 何谓并发和多线程 为什么要在应用程序中使用并发和多线程 C++并发支持的发展历程 一个简单的C++多线程程序是什么样的 这是C++用户的振奋时刻.距1998年初始的C++标准发布13年后,C++标准委员会给予程序语言和它的支持库一次重大的变革.新的C++标

《Java并发编程实战》要点笔记及java.util.concurrent 的结构介绍

买了<java并发编程实战>这本书,看了好几遍都不是很懂,这个还是要在实战中找取其中的要点的,后面看到一篇文章笔记做的很不错分享给大家!! 原文地址:http://blog.csdn.net/cdl2008sky/article/details/26377433 Subsections  1.线程安全(Thread safety) 2.锁(lock) 3.共享对象 4.对象组合 5.基础构建模块 6.任务执行 7.取消和关闭 8.线程池的使用 9.性能与可伸缩性 10.并发程序的测试 11.显

Java 并发编程:核心理论

并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程序.本系列会从线程间协调的方式(wait.notify.notifyAll).Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制.在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式.实现源码及其背后的原理.本