python协程的用法,手动切换协程,自动切换协程

通过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())

猜你喜欢

转载自blog.csdn.net/weixin_44123630/article/details/113484581