python 协程

298 阅读1分钟
知识点
from gevent import monkey
# 要想要所有的阻塞操作能够自动切换 需要破解
monkey.patch_all()  
import gevent, time
# 协程函数
def worker1(n):
    for i in range(n):
        print('in worker1 %s' % gevent.getcurrent())

# 创建一个协程  协程函数 多个参数 ----> 开始运行了
g1 = gevent.spawn(worker1,10)
g2 = gevent.spawn(worker1,10)

# 在主进程中等待协程执行完成 --->  如果主进程退出了  所有协程全部结束
# g1.join()
# g2.join()

# 在默认情况下, gevent 不会对协程自动切换  程序内部已经将那些跟阻塞相关(recv recfrom accpet time.sleep)的操作, input不能破解
# 如果需要同时等待多个协程执行完成,否则主线程结束,协程不再运行
gevent.joinall([g1,g2])
案例:协程多任务下载器
from gevent import monkey
monkey.pach_all()
import urllib.request
def down_html(url):
    # 请求服务器  返回值是一个响应对象
    response = urllib.request.urlopen(url)
    #取出对象中的数据
    data = response.read()
    print('获取%s 网页数据成功 %d 字节 % (url, len(data)))

it __name__'__main__':
    begin = time.time()
    # 创建并运行协程
    g1 = gevent.spawn(down_html, 'http://baidu.com')
    g2 = gevent.spawn(down_html, 'http://itcast.com')
    g3 = gevent.spawn(down_html, 'http://itheima.com')
    # 等待协程结束
    gevent.joinall([g1,g2,g3])
    end = time.time()
    print('消耗了%3f秒' % (end - gevent))