Python实现协程的几种方法!这个非常有用!

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

异步化框架一部分

  • 异步非阻塞、asyncio
  • tornado、fastapi、django3.x asgi、aiohttp都在异步化 -->提升性能

协程详解

  • 协程不是计算机提供,程序员认为创造。
  • 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。
  • 简而言之:其实就是通过一个线程实现代码块相互切换执行。
  • 协程意义:在一个线程中如果遇到IO等待时间,线程不会傻傻等,利用空闲时间去干其他事实例: def fun1(): #如果按正常思路来执行的话 print(1) print(2) #程序会先执行fun1()、再次执行fun2() def fun2(): print(3) print(4) #(核心) #协程意思就是在fun1()和fun2()中来回切换的执行 fun1() #当然协程只有一个线程来完成这个事情 fun2() 输出结果为: 1 2 3 4 123456789101112131415

Python中实现协程的几种方法:

  • greenlet 这是一个第三方模块,也是一个早期的模块
  • yield 关键字实现
  • asyncio装饰器(py3.4版本以上)
  • async、await关键字(py3.5以上【推荐】)

通过greenlet实现协程

pip install greenlet -i https://pypi.doubanio.com/simple	--安装模块





from greenlet import greenlet								--导入模块

def fun1():													
    print(1)				-- 第二步: 输出 1
    gr2.switch()			-- 第三步:执行 gr2 (也就是func2函数)
    print(2)				-- 第六步:输出 2
    gr2.switch()			-- 第七步:执行 gr2 (也就是func2函数)

def fun2():
    print(3)				-- 第四步:输出 3
    gr1.switch()			-- 第五步:执行 gr1 (也就是fun1函数)
    print(4)				-- 第八步:输出 4
												
gr1 = greenlet(fun1)						
gr2 = greenlet(fun2)
gr1.switch()				-- 第一步:去执行 func1 函数
输出为:  1
		3
		2
		4
#如此执行,就实现了一个线程在函数中来回切换执行的方式.也就是协程
123456789101112131415161718192021222324252627

通过yield关键字实现协程

def fun1():
    yield 1
    yield from fun2()		-- 当调用fuc1()函数时,执行到这里,会执行fuc2函数 ↓
    yield 2					-- 等func2函数执行完毕,跳回刚才跳出的位置,继续执行fuc1

def fun2():
    yield 3
    yield 4

f1 = fun1()				或  #   f = fun1()		
for item in f1:				#   print(next(f))
    print(item)				#	print(next(f))
						    #	print(next(f))
输出为:1					    #	print(next(f))
	  3
	  4
	  2

#这种方式是伪造的协程,不推荐使用,但是也实现了协程的定义
12345678910111213141516171819

通过asyncio模块实现(python3.4版本之后的标准库)

import asyncio

@asyncio.coroutine					#打上这个装饰器,才能是协程函数
def fun1():
    print(1)
    yield from asyncio.sleep(2)    #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(2)

@asyncio.coroutine
def fun2():
    print(3)
    yield from asyncio.sleep(2)     #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(4)

tasks = [
     asyncio.ensure_future(fun1()),
     asyncio.ensure_future(fun2())		#列表中是来回切换的函数
 ]
loop = asyncio.get_event_loop()
loop.run_until_complete(fun1())

#注意遇到IO阻塞 自动切换(python3.5之后推荐使用关键字)
12345678910111213141516171819202122

async & await 关键字实现协程(Python3.5版本之后)

import asyncio

async def fun1():
    print(1)
    await asyncio.sleep(2)    #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(2)


async def fun2():
    print(3)
    await asyncio.sleep(2)     #遇到IO耗时操作,自动化切换到tasks中其他任务
    print(4)

tasks = [
     asyncio.ensure_future(fun1()),
     asyncio.ensure_future(fun2())
 ]
loop = asyncio.get_event_loop()
loop.run_until_complete(fun1())
#注意遇到IO阻塞 自动切换

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

完整代码可以点击下方链接获取~

python免费学习资料以及群交流解答点击即可加入

 

Python协程的底层实现 生成器 协程的核心就是上下文切换,在Python中最简单的实现是用生成器 生成器有个方法 send() 可以从调用者向生成器函数发送数据,这样就可以在生成器中 yield future 表示要等待 future 的结果,然后把上下文切换到调用者,等 future 结果准备好后调用者再 send(future.result()) 给生成器发送结果,并把上下文切换到生成器函数 def gener... 阅读详情

相关推荐

Python协程讲解

上篇文章我们说过由于GIL锁的限制,导致Python不能充分利用多线程实现高并发,在某些情况下使用多线程可能比单线程效率更低,所以Python中出现了协程协程(coroutine)又称微线程,是一中轻量级的线程,它可以在函数的特定位置暂停或恢复,同时调用者可以从协程中获取状态或将状态传递给协程。进程和线程都是通过CPU的调度实现不同任务的有序执行,而协程是由用户程序自己控制调度的,也没有线程切换的开销,所以执行效率极高。 生成器方式实现 早先的协程是使用生成器关键字yield来实现的,和生成器很相.

weixin_50097774的博客 3656

Python实现协程几种方法

异步化框架一部分 异步非阻塞、asyncio tornado、fastapi、django3.x asgi、aiohttp都在异步化 -->提升性能 协程详解 协程不是计算机提供,程序员认为创造。 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。 简而言之:其实就是通过一个线程实现代码块相互切换执行。 实例: def fun1(): #如果按正常思路来执行的话 print(1) print(2) #程序会

weixin_44634704的博客 761

python协程池详解及多任务协程池下载器语法实现

协程池 在python中,当需要创建的⼦协程数量不多时,可以直接利⽤gevent模块中的spawn动态成⽣多个协程,但如果是上百甚⾄上千个⽬标,⼿动的去创建协程的⼯作量巨⼤,此时就可以⽤到gevent模块提供的pool.Pool⽅法。初始化Pool时,可以指定⼀个最⼤协程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建⼀个新的协程⽤来执⾏该请求;但如果池中的协程数已经达到指定的最⼤...

weixin_44850984的博客 2590

Python协程

1.基本概念 1.阻塞/非阻塞 概念 定义 阻塞 程序未得到计算资源时被挂起的状态,在此期间程序无法处理其他事情 非阻塞 程序未得到计算资源时被挂起的状态,在此期间程序任然可以处理其他事情 2.同步/异步 概念 定义 场景 同步 不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,我们称这些程序单元是同步执行的 购物系统中更新商品库存,用行锁作为通信信号 异步 不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步

XiaoPawnYe的博客 3019

PyQt5之理解和使用Python中的qasync:连接Qt和asyncio的桥梁

qasync是一个Python库,它允许你在Qt的事件循环中使用asyncio。它提供了一种在Qt应用程序中运行asyncio协程方法,使你能够在基于Qt的GUI应用程序中编写异步代码,而不会阻塞主事件循环。

载_酒i 2315

协程的四种实现(基于python

asyncio便会自动的执行其他任务,输出3;接着func2()阻塞2秒,func1()阻塞结束,打印2,解析:首先执行协程函数func1()(也可以说是任务1),输出1,这时人为进行阻塞2秒。也就是说asyncio能够在IO阻塞时自动的切换其他协程任务。func2()阻塞结束,打印4。

LHB123456789L的博客 273

python协程

1,多进程的理解 多线程和多进程都可以执行多个任务,线程是进程的一部分。线程的特点是线程直接可以可以共享内存和变量,资源消耗较少(Unix环境中,多进程和多线程资源消耗差距不是很大,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦 2,python多线程创建 在python中,同样可以实现多线程,有两个标准模块thread和threading,一般主要使用更加高级的threadi...

weixin_42337937的博客 344

python 协程实现

协程,又称微线程,纤程。英文名Coroutine。协程不是计算机提供的,是人为创造的上下文切换技术,也可以被称为微线程。简而言之 其实就是在一个线程中实现代码块相互切换执行。

cliffordl的专栏 1592

Python协程的四种实现方式

Python协程的四种实现方式

weixin_45005677的博客 3387

Python协程实现

协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。 python可以通过 yield/send 的方式实现协程。在python 3.5以后,async/await 成为了更好的替代方案。 async/await async/await关...

你的灯在亮 2864

Python使用gevent实现协程

Python使用gevent实现协程 Python中多任务的实现可以使用进程和线程,也可以使用协程。 一、协程介绍 协程,又称微线程。英文名Coroutine。协程Python语言中所特有的,在其他语言中没有。 协程python中另外一种实现多任务的方式,比线程更小、占用更小执行单元(理解为需要的资源)。 在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切...

weixin_43790276的博客 2783

原来Python协程有2种实现方式

Python 中,协程(Coroutine)是一种轻量级的并发编程方式,可以通过协作式多任务来实现高效的并发执行。协程是一种特殊的生成器函数,通过使用 yield 关键字来挂起函数的执行,并保存当前的执行状态。协程的执行可以通过 send 方法来恢复,并在下一次挂起时返回一个值。在 Python 3.4 之前,协程通常使用 yield 关键字来实现,称为“生成器协程”。在 Python 3.4 引入了 asyncio 模块后,可以使用 async/await 关键字来定义协程函数,称为“原生协程”。

bagell的博客 963

python使用协程_python使用协程实现并发操作的方法详解

本文实例讲述了python使用协程实现并发操作的方法。分享给大家供大家参考,具体如下:协程协程是一种用户态的轻量级线程,又称微线程。协程拥有自己的寄存器上下文和栈,调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所...

weixin_35868872的博客 1741

python实现协程的三种方式

1.使用yield 来实现协程 import asyncio import time async def job(t): # async 形式的功能 print('Start job ', t) await asyncio.sleep(t) # 等待 "t" 秒, 期间切换其他任务 print('Job ', t...

u011089760的博客 6364

python协程三种实现方法

协程的三种方法 1,协程中名词 event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数(协程)注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine 协程协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 future 对象: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装

kainystar的博客 1080

python协程+异步实战!

实现了 __aiter__()和 __anext__()方法的对象。

墨城的博客 863

python协程(1): 基本介绍及yield实现协程

https://www.liaoxuefeng.com/wiki/1016959663602400/1017968846697824

Python开发分享的博客 2841
上一篇: Python有哪些神一般的骚操作? 远远不止抢车票、抢红包《附代码》
下一篇: 国庆长假已结束,Python 告诉你 6 亿国人都去哪儿浪了
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值