进程_线程 之(六) --- 协程

协程简介

区别:线程和进程的操作是由程序触发系统接口,执行者是系统;协程的操作则是程序员。

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。

        协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。

协成的原理:利用一个线程,分解一个线程成为多个微线程,注意此时从程序级别来分解的

适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

实现技术

需要手动安装 greenlet模块 和 gevent模块。安装gevent模块会默认安装greenlet模块

基于底层greenlet+switch实现

采用greenlet+switch机制来处理协程。greenlet用于创建协程,switch进行协程之间的切换。

某个协程在执行的过程中可以被其他协程通过switch中断转而去执行其他协程,

当前中断的协程的现场会被保存,一旦中断的协程再次获得cpu以后首先会恢复现场继续执行。

这种机制下的协程之间是串行执行,没有办法实现并发

 1 from greenlet import greenlet
 2 
 3 def test1():
 4     print(1,2)      # 2.执行输出语句,输出1,2
 5     gr2.switch()    # 3.执行完上面输出语句后,此行调用test2函数  
 6     print(3,4)        # 6.执行输出语句,输出3,4
 7     gr2.switch()     # 7.执行完上面输出语句后,此处调用test2函数
 8 
 9 def test2():
10     print(5,6)     # 4.执行输出语句,输出5,6
11     gr1.switch()     # 5.执行完上面输出语句后,此行调用test1函数
12     print(7,8)     # 8.执行输出语句,输出7,8
13 
14 gr1 = greenlet(test1) # 1.调用grl1对应的test1函数
15 gr2 = greenlet(test2)
16 gr1.switch()
1 1,2
2 5,6
3 3,4
4 7,8
输出结果

基于底层gevent+sleep实现

gevent+sleep机制通过对协程进行阻塞来实现协程之间切换与同步

 1 import gevent
 2 
 3 def foo():
 4     print('Running in foo')
 5     gevent.sleep(0)
 6     print('Explicit context switch to foo again')
 7 
 8 def bar():
 9     print('Explicit context to bar')
10     gevent.sleep(0)
11     print('Implicit context switch back to bar')
12 
13 gevent.joinall([
14     gevent.spawn(foo),
15     gevent.spawn(bar),
16 ])
1 Running in foo
2 Explicit context to bar
3 Explicit context switch to foo again
4 Implicit context switch back to bar
输出结果

 基于底层gevent+monket实现

 1 import gevent
 2 from gevent import monkey
 3 import requests
 4 
 5 # 用monkey给整个协程程序添加一个非阻塞I/O的操作
 6 monkey.patch_all()
 7 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
 8 
 9 def fn(url,i):
10     print("协程%d开启!"%i)
11     res = requests.get(url=url,headers=headers)
12     html = res.text
13     print("协程%d执行结束,响应体的大小为:%d"%(i,len(html)))
14 
15 if __name__ == '__main__':
16     urls = [
17         "https://www.baidu.com/",
18         "https://www.163.com/",
19         "https://www.qq.com/",
20         "https://www.sina.com.cn/",
21         "https://www.ifeng.com/"
22     ]
23     # 创建一个列表用于管理所有的协程
24     g_list = []
25     for i in range(len(urls)):
26         # 创建协程
27         g = gevent.spawn(fn,urls[i],i)
28         g_list.append(g)
29     # 启动所有的协程
30     gevent.joinall(g_list)
1 协程1开启!
2 协程2开启!
3 协程3开启!
4 协程4开启!
5 协程1执行结束,响应体的大小为:673160
6 协程0执行结束,响应体的大小为:156755
7 协程4执行结束,响应体的大小为:220961
8 协程3执行结束,响应体的大小为:564692
9 协程2执行结束,响应体的大小为:231551
输出结果

实例

 1 from gevent import monkey; monkey.patch_all()
 2 import gevent
 3 import requests
 4 
 5 def f(url):
 6     print('GET: %s' % url)
 7     resp = requests.get(url)
 8     data = resp.text
 9     print('%d bytes received from %s.' % (len(data), url))
10 
11 gevent.joinall([
12         gevent.spawn(f, 'https://www.python.org/'),
13         gevent.spawn(f, 'https://www.yahoo.com/'),
14         gevent.spawn(f, 'https://github.com/'),
15 ])
1 GET: https://www.python.org/
2 GET: https://www.yahoo.com/
3 GET: https://github.com/
4 431218 bytes received from https://www.yahoo.com/.
5 25529 bytes received from https://github.com/.
6 47394 bytes received from https://www.python.org/.
输出结果

 

 

转载于:https://www.cnblogs.com/TMMM/p/10786226.html

Python进程、线程、协程 每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。这种任务虽然也可以用多任务完成,但是当任务过多时(超过cpu的核数),花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。:涉及到网络、磁盘IO的任务都是IO密集型任务,比如网络传输、数据库等调用、爬虫等,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(存在阻塞),99%的时间花费在IO上(因为IO的速度远远低于CPU和内存的速度)。 阅读详情

相关推荐

单细胞RNA测序数据分析与可视化:从基础原理到高级应用

单细胞RNA测序(scRNA-seq)技术通过解析单个细胞的基因表达谱,显著提升了我们对细胞异质性的理解。本文详细介绍了scRNA-seq数据分析的完整流程,包括数据预处理、质量控制、降维、聚类、差异表达分析、细胞类型注释、细胞周期分析、轨迹分析、RNA速率分析、基因集富集分析、细胞通讯分析、批次效应校正以及空间转录组学整合。文章还展示了scrna_toolkit包在简化分析流程和增强数据可视化方面的应用。通过这一工具,研究者可以更高效地处理单细胞数据,揭示复杂的生物学信息。未来,该工具将进一步整合多组学分

2301_80338712的博客 4130

<六>进程、线程、协程

<1>进程与线程 进程:系统为程序执行分配的资源,是资源的集合,是程序的一次执行活动 线程:实际就是系统调度的一堆指令,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。 区别:①线程共享创建它的进程的地址空间;进程有自己的地址空间    ②线程直接访问数据段的过程;进程有自己的复制父进程的数据段    ③线程可以直接与其他线程交流;进程必...

weixin_30835649的博客 113

深入解析FPGA中的GTX高速收发器架构与设计原理

本文深入解析了FPGA中GTX高速收发器的核心架构与设计原理。文章将GTX比作数据“高速公路”,详细拆解了其PMA(物理媒介适配层)与PCS(物理编码子层)的双层结构,阐述了串并转换、时钟恢复等关键技术,并提供了时钟源选型(QPLL/CPLL)、上电复位流程及信号完整性调试等实战指南,是掌握高速接口设计的必备知识。

f6g7h8i9j的博客 219

python (协程/线程/进程) (六)小结

什么是进程 进程-操作系统提供的抽象概念,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程。 当程序需要运行时,操作系统将代码和所有静态数据记载到内存和进程的地址空间(每个进程都拥有唯一的地址空间,见下图所示)中,通过创建和初始化栈(局部变量,函数参数和返回地址)、分配堆内存以及与IO相关的任务,当前期准备工作完成,启动程序,OS将CPU的控制权转移到新创建的进程,进

_yuki_ 1040

星辰超级智能体TeleClaw桌面版深度体验:央企出品的本地AI生产力助手

中国电信星辰超级智能体TeleClaw桌面版是一款本地化AI生产力助手,主打数据安全、自主高效和深度协同。作为程序员,作者实测其核心功能包括本地数据处理、长期记忆、定时任务和代码开发辅助,特别适合敏感数据处理和日常办公自动化。相比在线AI工具,TeleClaw在数据安全、合规性和自动化能力方面优势明显,但技能生态和响应速度仍有提升空间。总体评价为务实高效的本地AI助手,尤其适合对数据安全有要求的企业用户。

研究中.... 1355

41页PPT | 华为业务流程架构全景视图:全业务域L1-L3级流程全案

TBD、收集和生成线索、验证机会点、TBD、管理销售授权、管理销售项目、管理销售项目群、管理合同要素/模板、验证和分发线索、标前引导、管理开票和回款、客户网络评估、管理销售评审、TBD、管理交付项目群、管理合同文档、管理结构化合同信息、跟踪和培育线索、制定并提交标书、管理合同/PO变更、客户网络规划、管理销售决策。:4.1 管理技术、服务请求、4.2管理备件、服务交付、4.3管理非技术、服务请求、4.4管理客户、投诉。:管理Idea、产生Idea、激发兴趣与协作、孵化、原型和验证、确认Idea与商业化。

zuoan1993的博客 4550

python多线程调度_python并发编程之进程、线程、协程的调度原理(六)

进程、线程和协程的调度和运行原理总结。系列文章进程、线程的调度策略介绍linux中的进程主要有三种调度策略:优先级调度:将进程分为普通进程和实时进程;先进先出(队列)调度:实时进程先创建的先执行,直到遇到io或主动阻塞。轮转调度(时间片):达到一定的CPU执行时间后强制切换;多进程程序的调度其实还是线程的调度,线程才是CPU调度的基本单位;在同一个进程内线程切换不会产生进程切换,由一个进程内的线程...

weixin_39726044的博客 128

软件测试学习笔记(二)图覆盖

软件测试学习笔记(二)图覆盖 课程链接软件测试_中国大学MOOC 2.1 测试中的图 2.2 图覆盖准则 1、什么是图? 点的集合和边的集合。点或者结点,有穷非空的集合。边是点对。 2、图为什么在软件测试中具有重要地位? 所谓软件测试就是将软件变作一张图,然后覆盖它,不仅仅是软件,图更是计算机科学重要的结构。 3、软件测试中的图是如何得到的? 常见的图可以来自源代码,常见的是控制流图,还有各种各样...

DZFinder的博客 1420

python并发编程之进程、线程、协程的调度原理(六)

进程、线程和协程的调度和运行原理总结。 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asyncio协程(三) python并发编程之gevent协程(四) python并发编程之Queue线程、进程、协程通信(五) python并发编程之进程、线程、协程的调度原理(六) python并发编程之...

weixin_30726161的博客 100

实战避坑:示波器测量非隔离开关电源的炸机风险与隔离方案

本文详细分析了使用示波器测量非隔离开关电源时的炸机风险,揭示了地线环路导致的短路问题,并对比了四种防炸机解决方案,包括示波器隔离供电、拔掉电源地线、使用差分探头和被测板隔离供电。重点推荐使用隔离变压器方案,确保测量安全与精度,同时提供了实操建议与经验分享,帮助工程师避免常见测量事故。

weixin_29224309的博客 558

Xilinx系FPGA学习笔记(三)Vivado的仿真及ILA使用

接着学习vivado的使用方法。

贾saisai的博客 2546

python 复习—并发编程实战(六)——线程、多进程、多协程加速程序运行实例(多线程和多进程的对比)

一、多线程实例 import threading import time lock = threading.Lock() class Account: def __init__(self, balance): self.balance = balance def draw(account, amount): with lock: if account.balance >= amount: time.sleep(0.1)

Shallow的博客 451

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

爱数 AnyShare存在未授权漏洞,未授权的攻击者可以通过该漏洞获取用户名信息。

qq_67810151的博客 3121

进程、线程、协程

进程、线程、协程 一、概念与区分 1、进程 进程是程序一次动态执行的过程,是程序运行的基本单位。 每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。 进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、页表、文件句柄等)比较大,但相对比较稳定安全。协程切换和协程切换 2、线程 线程又叫做轻量级进程,是CPU调度的最小单位。 线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。 多个线程共享所属进程的资源,同时线程也拥有自己的专属资源。

Pinker_Q 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

线程、进程、协程的总结详细

线程、进程、协程的同步机制、通信机制、生命周期的详细描述,以及线程、进程、协程之间的对比

weixin_44462773的博客 3883

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

协程是线程的儿子,线程是进程的儿子,所以协程是进程的孙子?

协程、线程和进程之间的关系并不是简单的父子或祖孙关系,而是各自在并发模型中扮演不同的角色。

长风破浪会有时的博客 1179

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

进程 vs 线程、协程

进程 vs 线程、协程

WuqianZhi_123的博客 1023

进程,线程和协程的区别

进程,线程和协程的区别一. 概念二. 区别三. 进程和线程、协程在python中的使用四. 一个形象的例子解释进程和线程的区别 现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来。python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程。本文主要介绍进程、线程和协程三者之间的区别。 一. 概念 1. 进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进

海里鱼的技术博客 2021

进程、线程和协程

进程、线程以及协程的相关概念

。 859

进程、线程、协程和管程

这里写目录标题进程、线程、协程和管程的概念进程和线程区别进程与线程的联系线程和协程的区别 进程、线程、协程和管程的概念 进程是操作系统进行资源分配和调度的一个基本单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。进程上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 线程是CPU调度和分派的基本单位,一个进程可以拥有多个线程。线程自己基本上不拥有系统资源,只拥有少部分的资源(如程序计数器,一组寄存器和栈)。线程间通信主要通过共享内存,上下文切换很快,资源

TABE_的博客 2305

【Go】十七、进程、线程、协程

如上,主线程中,开启一个协程,协程每1秒输出hello golang,主线程每一秒输出一次hello 9527,主线程和协程在同时执行,且属于同一个线程(主线程)。协程的引入,给CPU一种:该线程好像是一直在计算,io比较少的错觉,从而会更多的将cpu的执行权限分配给我们的线程。多协程操作同一个数据的问题:按以下1.2.3.4.5.6的步骤,就发现做了一次+1,一次-1,结果为-1。线程是CPU控制的,而协程是程序自身控制的,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级。

llg___的博客 1806
上一篇: 进程_线程 之(五) --- 生产者消费者
下一篇: python --- 难点重点总结
baoding4359
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值