通过yield生成器来实现协程
import time
def consumer(): #函数中如果有yield,那么c=consumer()不会执行该函数,只有执行了c.__next__()才会执行该函数
print('消费者准备吃包子')
while True:
baozi=yield #yield生成器,用于接收其他函数中send发送的数据,当接收到数据后才会执行下面的代码
print('消费者吃了包子',baozi)
def producer():
c=consumer() #该函数暂时不会执行,因为含有yield,只有当c.__next__()执行时,才会执行c=consumer()
c.__next__() #consumer()函数中含有yield时,不会执行,只有执行了c.__next__(),才会执行consumer()
for i in range(5):
time.sleep(1)
print('生产者生产了包子',i)
c.send(i) #该函数将值发送给yield,yield后面的代码才会执行
if __name__=='__main__':
producer()
通过greenlet实现协程,手动切换任务执行
from greenlet import greenlet
def work1():
print(1)
gr2.switch() #暂停gr1,切换到gr2执行
print(3)
gr2.switch()
print('任务1执行完毕')
def work2():
print(2)
gr1.switch() #暂停gr2,切换到gr1执行
print(4)
print('任务2执行完毕')
gr1.switch()
if __name__=='__main__':
gr1=greenlet(work1) #创建协程1
gr2=greenlet(work2) #创建协程1
gr1.switch() #gr1先执行
print('主程序执行完毕')
自动切换任务执行
import gevent
def work1():
print('任务1执行')
gevent.sleep(3)
print('任务1执行完毕')
def work2():
print('任务2执行')
gevent.sleep(2)
print('任务2执行完毕')
def work3():
print('任务3执行')
gevent.sleep(1)
print('任务3执行完毕')
if __name__=='__main__':
gevent.joinall([
gevent.spawn(work1), #work1阻塞时,自动切换到work2
gevent.spawn(work2), #work2阻塞时,自动切换到work3
gevent.spawn(work3),
])
通过协程加载多个网页
from gevent import monkey; monkey.patch_all() #此处必须添加此函数,保证多协程并发
import gevent
import requests
def f(url):
print('开始请求网页:',url)
resp=requests.get(url)
print(resp.text[:100])
print('结束:',url)
print('-----------------------------------------------------')
if __name__=='__main__':
gevent.joinall([
gevent.spawn(f,'https://www.baidu.com'),
gevent.spawn(f,'https://www.163.com/'),
gevent.spawn(f,'https://www.sina.com.cn/'),
])
asyncio用法介绍
import time
import asyncio
async def work(): #通过async关键字,将此函数定义为协程的任务函数
print('任务执行了')
if __name__=='__main__':
coroutine=work() #创建任务函数对象,由于async关键字存在,此时函数还未执行
loop=asyncio.get_event_loop() #创建一个事件循环的协程对象
loop.run_until_complete(coroutine) #将任务函数传入事件循环,执行任务函数
asyncio多协程用法
import time
import asyncio
async def work1():
print('任务1执行了')
return 1
async def work2():
print('任务2执行了')
return 2
if __name__=='__main__':
coroutine1=work1()
coroutine2=work2()
loop=asyncio.get_event_loop()
task1=asyncio.ensure_future(coroutine1) #该函数可获取任务函数的返回值
task2=asyncio.ensure_future(coroutine2)
loop.run_until_complete(task1)
loop.run_until_complete(task2)
print('任务1的返回值:',task1.result()) #打印任务函数的返回值
print('任务2的返回值:',task2.result())