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

news2024/9/23 3:26:31

进程

  • 为什么要使用多进程?——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"))#创建task
    task_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 asyncio

async 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 asyncio

async def f1():
	await asyncio.sleep(1)#这是非阻塞的协程 ,类似于yeild
	print("f1:done")

async def f2():
	asyncio.sleep(1)#非阻塞的协程 ,类似于yeild
	print("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()#等f4

async def f_4():
	print("f4 doing")

if __name__=="__main__":
	asyncio.run(f_3())#第一个协程的运行

或者使用task方法执行协程

在这里插入图片描述

并发方案的选择

1 分布式,还是单击

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

2 CPU密集,还是IO密集

  • CPU密集,多进程

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

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

4 是否有动态调度

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移除和替换任何内容:AI 驱动的图像修复工具 | 开源日报 No.204

Sanster/IOPaint Stars: 15.1k License: Apache-2.0 IOPaint 是一款由 SOTA AI 模型驱动的图像修复工具。 该项目解决了从图片中移除任何不需要的对象、瑕疵或人物,以及擦除和替换图片上任何内容(由稳定扩散技术支持)的问题。 完全免费且开…

ETH Denver 2024 精彩回顾|波卡,远不止一个区块链

ETH Denver 2024 于 2 月 23 日至 3 月 3 日在美国丹佛举行,该活动由 SporkDAO 主办(SporkDAO 是一个来自美国科罗拉多州的 Web3 公益开发者组织,其前身或者说起源就是 ETHDenver,后随着组织发展逐渐转变为 DAO 开展了研究、投资等…

YOLO-v8-seg实例分割使用

最近需要实例分割完成一些任务,一直用的SAM(segment anything)速度慢,找一个轻量分割模型。 1. YOLO-v8-seg使用 git clone https://github.com/ultralytics/ultralytics.git cd ultralytics vim run.py from ultralytics import YOLO# L…

JS加密解密之字符编码知识

在前端开发中,字符编码是一个至关重要的概念,特别是在数据传输、加密和解密等方面。JavaScript作为一种常用的脚本语言,在处理字符编码时也有其独特之处。本文将详细介绍JavaScript中的字符编码知识,包括字符编码的分类和相关案例…

【C++】1600. 请假时间计算

问题:1600. 请假时间计算 类型:基本运算、整数运算 题目描述: 假设小明的妈妈向公司请了 n 天的假,那么请问小明的妈妈总共请了多少小时的假,多少分钟的假?(提示: 1 天有 24 小时&…

2_27. 移除元素

2_27. 移除元素 难度: 简单 提示: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变…

知识管理入门:轻松选择合适的知识管理软件

你是不是经常觉得自己的大脑像个杂乱的仓库,各种信息、知识和想法在里面乱窜,找不到头绪?别担心,知识管理软件来帮你解决这个问题啦!今天,我们就来聊聊知识管理软件这个神奇的工具,新手也能轻松…

python基础——语句

一、条件语句 就是 if else 语句 ! 代表不等于 代表等于if 关键字,判断语句,有“如果”的意思,后面跟上判断语句else 常和“if” 连用,有“否则”的意思,后面直接跟上冒号 …

华为配置WLAN 802.1X认证实验

配置WLAN 802.1X认证示例 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤 业务需求 用户接入WLAN网络,使用802.1X客户端进行认证,输入正确的用户名和密码后可以无线上网。且在覆盖区域内移动发生漫游时&…

鸿蒙一次开发,多端部署(三)应用UX设计原则

设计原则 当为多种不同的设备开发应用时,有如下设计原则: 差异性 充分了解所要支持的设备,包括屏幕尺寸、交互方式、使用场景、用户人群等,对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外,还…

vue3 reactive丢失响应式

问题 使用 reactive 构造响应式对象时,当对其进行重新赋值后,会导致原有变量失去响应式,页面不会发生联动更新 例如: 1、使用 reactive 定义一个响应式的对象变量 let data1 reactive({name: 小李,date: 2024-03-18,address: xx…

基于Python的HTTP接口自动化测试框架实现

对服务后台一系列的http接口功能测试。 输入:根据接口描述构造不同的参数输入值 输出:XML文件 二、实现方法 1、选用Python脚本来驱动测试 2、采用Excel表格管理测试数据,包括用例的管理、测试数据录入、测试结果显示等等,这…

美团2023年财报:全年营收2767亿元,即时配送订单219亿笔

3月22日,美团(股票代码:3690.HK)发布2023年第四季度及全年业绩。公司各项业务继续取得稳健增长,全年营收2767亿元(人民币,下同),同比增长26%,经营利润134亿元。 本年度,美团继续围绕“零售科技”战略&…

C# winform修改背景图 控件双向绑定 拖拽打开图片

修改背景图 说明 这里我准备基于百度飞桨PaddleSeg项目的人像分割模块做一个人像抠图,这里顺便用上了双向绑定和图片拖拽打开。 下面就是示例: 用颜色替换 用背景图替换 保存成功后的图片 一、使用百度飞桨PaddleSeg //初始化 引擎engine new Padd…

用易货模式做成小程序商城的可行性分析

在当前的商业环境中,易货模式已经逐渐被人们所熟知和接受。这种以物易物的交易方式,不仅能帮助企业降低库存压力,还能有效促进资源的优化配置。那么,如果我们用易货模式来打造一个小程序商城,这样的想法是否可行呢&…

【探索Linux】—— 强大的命令行工具 P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)

阅读导航 引言一、TCP协议二、TCP网络程序模拟实现1. 预备代码⭕ThreadPool.hpp(线程池)⭕makefile文件⭕打印日志文件⭕将当前进程转变为守护进程 2. TCP 服务器端实现(TcpServer.hpp)3. TCP 客户端实现(main函数&…

Doris实战——天眼查Doris实时数仓构建

目录 前言 一、业务背景 二、原有架构及痛点 三、理想架构 四、技术选型 五、新数仓架构 六、应用场景优化 6.1 人群圈选 6.2 C端分析数据及精准营销线索场景 七、优化经验 八、规模和收益 九、未来规划 原文大佬的这篇实时数仓构建有借鉴意义的,这些摘…

JavaEE 初阶篇-深入了解进程与线程(常见的面试题:进程与线程的区别)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 进程概述 2.0 线程概述 2.1 多线程概述 3.0 常见的面试题:谈谈进程与线程的区别 4.0 Java 实现多线程的常见方法 4.1 实现多线程方法 - 继承 Thread 类…

从先序与中序遍历序列构造二叉树

从先序与中序遍历序列构造二叉树 描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 递归法 解题思路: 通过先序遍历我…

山西生态与智慧水利科技展会之华锐VRAR元宇宙水利应用展位恭候大驾

2024黄河流域生态与智慧水利科技博览会于今日在山西太原隆重开启,本次展会持续至3月24日共三天时间,相比之前的水展,这次展会区域之广辐射了中部六省,展会内容之多包括黄河流域生态保护的现状与挑战、水资源管理与水污染防治、智慧…