python5:基于多进程的并发编程、基于协程的并发编程的学习笔记

进程

  • 为什么要使用多进程?——GIL的存在,多线程实际不是并发执行
    将任务分为两类:
  • IO密集型(多线程)
  • CPU密集型(多进程)

多进程的基本用法

concurrent.futures.process.ProcessPoolExecutor#进程池 (与线程池用法一致
multiprocessing.Pool#单个进程
multiprocessing.Pool #进程池

可直接学习复习该链接:https://blog.csdn.net/ifhuke/article/details/128642625
有进程间通信,进程池
在这里插入图片描述

创建进程

委托操作系统创建,但不同操作系统创建进程的方式不一样

  • linux:fork:从父进程中继承内存(从运行了一半的程序中裂变出去)
  • windows:spawn:重新运行Python程序(1. 启动python程序; 2.import代码文件
  • 在这里插入图片描述
  • 在这里插入图片描述

协程

一种用户态的上下文切换技术(通过一个线程实现代码块间的相互切换执行,在一个协程中,遇到io等待时间,可以利用这个等待时间去做其他事情
yield就是一个协程思想的实现

yield、yield from

yield可以将函数变成生成器
在函数中加yield关键字,调用它,就会返回一个生成器
在这里插入图片描述
生成器的目的不是为了将代码打包,目的是为了生产或者返回一些值
1 创造生成器
2 通过next获取下一个值(可以理解为next去取yield的值)
3 如果遇到了StopIteration,说明内容生成结束
以上的用法,也叫做迭代器协议,就是不断从中去取内容,可以被for去使用
在这里插入图片描述
通过yield可以改变程序执行顺序,因此协程也称之为“用户态的线程”或“微线程”,即程序执行顺序是受用户控制的。
在Python中,协程是基于单线程的。
Tornado是一个Web开发框架,内部使用协程提供高并发

在这里插入图片描述
通过主线程去调度,即从g2中获得i,给到g3,再得到值,改进这个情况,引入yield from
在这里插入图片描述

yield是将生成器作为结果返回,yield from是把生成器的结果作为结果返回。但后来不用这个写法了,就先pass

协程的相关概念

  • 协程函数:定义为async def的函数
  • 协程对象:调用协程函数返回的对象
  • 事件循环:event loop 并发执行任务的大脑,判断哪些任务已处于可执行状态,并执行(循环只是主线程不断从事件队列里面取值/函数的过程)
  • 协程任务:rask 事件循环调度的最小单位,可由协程对象转化

关键字概述

  • async 定义函数时加上async,则该函数为协程函数
  • await 后面是一个可等待对象,如协程对象,协程任务---->去运行这个函数,运行完再继续fanhui
  • asyncio编写并发代码的库
  • run运行最高层级的入口点
  • asyncio.create_task() 创建task对象
import asyncio
import time
async def async_test(delay:int,content):await asyncio.sleep(delay)print(content)async def main():task_lady = asyncio.create_task(async_test(1,"lady"))#创建tasktask_killer = asyncio.create_task(async_test(2,"killer9"))await task_killer#可以await所有任务,如果只await了耗时短的,那么其他任务没有完成就结束了if __name__ == '__main__':print(f"start at {time.strftime('%X')}")asyncio.run(main())print(f"end at {time.strftime('%X')}")
  • gather 接收列表,结果是一个由所有返回值聚合而成的列表。结果值得顺序与was

生成器如何使用协程

借助工具实现协程,在这些工具中,使用yield关键字

  • Tornado提供了各种协程版的函数
  • 使用gevent的猴子补丁,可以不使用协程的写法,但是有协程的开发效果

asyncio模块

用来编写并发代码的酷,被用作多个提供高性能Python异步框架的基础,包括网络和网站服务,数据库链接库,分布式任务队列等,asyncio往往是构建IO密集型和高层级 结构化 网络代码的最佳选择

import time
import asyncioasync def f1():time.sleep(1)#这是线程阻塞的代码  整个线程会停住一秒print("f1:done")async def f2():time.sleep(1)#这是线程阻塞的代码print("f2:done")async def main():await f1();await f2();if __name__ == "__main__":time = time.time();asyncio.run(main());#入口time2 = time.time();print(f"耗时{time2-time:.2f} ");

耗时2s

用asyncio后改变的代码:

import time
import asyncioasync def f1():await asyncio.sleep(1)#这是非阻塞的协程 ,类似于yeildprint("f1:done")async def f2():asyncio.sleep(1)#非阻塞的协程 ,类似于yeildprint("f2:done")async def main():await f1();#等待协程结束await f2();

依然2s,依旧不是并行运行的,需要用到
在这里插入图片描述
修改代码:

async def main():await asyncio.gather(f1(),f2());

修改后,耗时1s,是并发操作
所以在异步编程中,如果有一处代码写成了同步,则整个代码都同步。
所以,像锁,sleep,迭代,队列,网络请求(socket)等都需要用异步资源
注意很多的第三方模块都是同步的,所以我们需要确定是“异步”的第三方库 https://github.com/aio-libs

async 和 await

创建协程的方式有两种,一种是yield关键字,一种是async关键字,我们一般用后者
定义函数时,加上async修饰,即async def func(),则该函数为协程函数,协程函数返回的对象即为协程对象

await后面是一个可等待对象,如协程对象,协程任务,用于告诉eventloop在此协程中需要等待后面的函数运行完成后才能继续(即执行下一个协程),运行完成后返回结果

新的协程如何运行
  • 在其他协程中被await
  • 使用asyncio模块提供第一个协程的运行
async def f_3():print("f3 doing")await f_4()#等f4async def f_4():print("f4 doing")if __name__=="__main__":asyncio.run(f_3())#第一个协程的运行

或者使用task方法执行协程

在这里插入图片描述

并发方案的选择

1 分布式,还是单击

  • 分布式,只能选择多进程

2 CPU密集,还是IO密集

  • CPU密集,多进程

3 单击IO密集型,并发数多不多

  • 如果不多,多线程(推荐)
  • 如果多,协程
  • 如果特别多:多进程+多线程+协程

4 是否有动态调度

  • 没有, 线程池
  • 有,手动创建线程

并发任务之间的通信:队列
并发任务之间的同步:锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/283384.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Airgorah:一款功能强大的WiFi安全审计工具

关于Airgorah Airgorah是一款功能强大的WiFi安全审计工具,该工具可以轻松发现和识别连接到无线接入点的客户端,并对特定的客户端执行身份验证攻击测试,捕捉WPA握手包,并尝试破解接入点的密码。在该工具的帮助下,广大研…

C语言联合体和枚举

前言 这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下,让我们好好看看联合体和枚举到底是什么 个人主页:小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录 1. 联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 相同成员的结构体和联…

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现PSO-KELM粒子群优化算法优化核极限学习机分类预测(完整源…

ideaSSM 高校公寓交流员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 高校公寓交流管理系统是一套完善的信息管理系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库&…

C语言:自定义类型(结构体)

目录 一、结构的特殊声明二、结构的自引用三、结构体内存对齐1.对齐规则2.为什么存在内存对齐(1)平台原因 (移植原因):(2)性能原因: 3.修改默认对齐数 四、结构体传参五、结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段使用的注意…

硬件工程师入门基础知识(四)多层陶瓷电容应用(三)

多层陶瓷电容应用(三) 1.开关电源输出滤波电容器如何选择和计算?2.线性电源和开关电源对于滤波电容的选择有何区别?3.哪些电路适合三端多层陶瓷电容?4.哪些电路适合金属支架多层陶瓷电容?1.开关电源输出滤波电容器如何选择和计算? 无论任何开关电源拓扑,其输出滤波的目…

乐得瑞科技PD协议芯片:OTG与充电并行,引领数据交互

在科技日新月异的今天,数据交互的方式对于我们的日常生活和工作都起到了至关重要的作用。但在OTG技术诞生之前,这一过程却显得相当繁琐和耗时。想象一下,你需要将数码相机的照片导入到笔记本电脑中,却不得不频繁地拔出内存卡&…

YOLOv5目标检测学习(6):源码解析之:训练部分train.py

文章目录 前言一、导入相关包与配置二、主函数main2.1 checks:检查rank值来判断是否打印参数、检查git仓库、检查包的安装2.2 判断是否恢复上一次模型训练提问:opt.data, opt.cfg, opt.hyp, opt.weights, opt.project各是什么? 2.3 DDP mode&…

基于JavaWeb+BS架构+SpringBoot+Vue+O2O生鲜食品订购小程序系统的设计和实现

基于JavaWebBS架构SpringBootVueO2O生鲜食品订购小程序系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图 文末获取源码 Lun文目录 目 录 摘 要 I Abstract II 1 绪 论 1 1.1课题研究背景及意义 1 1.2研究现状 1 1.3本论文的主要论文结构 3 2系统相关技术…

Qt实现TFTP Server和 TFTP Client(一)

1 概述 TFTP协议是基于UDP的简单文件传输协议,协议双方为Client和Server.Client和Server之间通过5种消息来传输文件,消息前两个字节Code是消息类型,消息内容随消息类型不同而不同。传输模式有三种:octet,netascii和mail,octet为二…

微服务cloud--抱团取暖吗 netflix很多停更了

抱团只会卷,卷卷也挺好的 DDD 高内聚 低耦合 服务间不要有业务交叉 通过接口调用 分解技术实现的复杂性,围绕业务概念构建领域模型;边界划分 业务中台: 数据中台: 技术中台: 核心组件 eureka&#x…

C/C++代码性能优化——编程实践

1. 编程实践 在一些关键的地方,相应的编程技巧能够给性能带来重大提升。 1.1. 参数传递 传递非基本类型时,使用引用或指针,这样可以避免传递过程中发生拷贝。参数根据是否需要返回,相应加上const修饰,代码更安全&am…

FPGA学习_时序分析

文章目录 前言一、组合逻辑与时序逻辑二、建立时间和保持时间三、建立时间和保持时间 前言 心中有电路,下笔自然神!!! 一、组合逻辑与时序逻辑 组合逻辑:没有时钟控制的数字电路,代码里的判断逻辑都是组…

解决淘宝镜像过期问题 ERR! request https://registry.npm.taobao.org

目录 一、问题描述 二、解决方案 2.1、针对于域名更换解决方案 2.2、针对于证书过期解决方案 三、进行测试 一、问题描述 针对于2022年5月31号和2024年1 月 22 日前的前端项目 npm.taobao.org和旧域名于2021年官方公告域名更换事件,已于2022年05月31日零时起…

每日一题 --- 977. 有序数组的平方[力扣][Go]

今天这一题和昨天的知识点是一样的,就是双指针法。 题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,1…

STM32 ESP8266模块的曲折探索

这是本文的配套资料,最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s,以下为产品规格书 引脚定义: 依据引脚定义&…

专业140+总分410+南京大学851信号与系统考研经验南大电子信息与通信集成,电通,真题,大纲,参考书。

今年分数出来还是有点小激动,专业851信号与系统140(感谢Jenny老师辅导和全程悉心指导,答疑),总分410,梦想的南大离自己越来越近,马上即将复试,心中慌的一p,闲暇之余&…

ubuntu 如何使用阿里云盘

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

通讯录的动态实现

文章目录 通讯录的动态实现模块化编程通讯录的框架构建功能的具体实现初始化通讯录添加联系人删除联系人查找联系人修改联系人打印通讯录排序通讯录检查容量并扩容加载通讯录保留通讯录销毁通讯录 完整代码总结 通讯录的动态实现 模块化编程 分文件 不同模块放在不同的文件下 …

XSKY 智能存储,助力“数据要素 X”先进制造

3 月 21-22 日,主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业,星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时,星辰天合先…