#!/usr/bin/env python # -*- coding: utf-8 -*- """ 协程:利用一个线程,分解一个线程为多个"微线程" -----程序级别实现的,跟系统无无关 协程在IO操作时使用才能提高效率 模块:greenlet gevent ---------gevent是对greenlet的封装(greenlet实现协程功能) 使用模块:pip3 install gevent """ """ #使用greenlet from gevent.greenlet import greenlet def f1(): print(12) gr2.switch() print(34) gr2.switch() def f2(): print(56) gr1.switch() print(78) gr1 = greenlet(f1) gr2 = greenlet(f2) gr1.switch() """ """ #使用gevnet import gevent def foo(): print('running in foo') gevent.sleep(0) print('Explicit context switch to foo again') def bar(): print('Exlicit context to bar') gevent.sleep(0) print('Implicit context switch back to bar') gevent.joinall([ gevent.spawn(foo), gevent.spawn(bar), ]) """ # 协程应用示例: # 协程发送先请求给f,而不等其执行完成,就发下一个 # 先把所有请求发送出去,然后再等待其执行完成(就好像一个线程又创建了多个微线程来执行任务) from gevent import monkey;monkey.patch_all() #默认socket是不支持执行完成通知的功能,这个就需要用monkey来封装一个具有通知功能的socket # ---没有这个,协程执行任务时还是等一个任务执行完才会创建并执行下一个任务 import gevent import requests def f(url): print('GET: ',url) response = requests.get(url) data = response.text print('%d received from %s' % (len(data),url)) # 批量创建任务,而不等待执行完成,最后统一等待执行结果 gevent.joinall([ gevent.spawn(f, 'https://www.python.org/'), gevent.spawn(f, 'https://www.baidu.com/'), gevent.spawn(f, 'https://www.github.com/'), ])
关注我的公众号,不定期推送资讯
本文来自博客园,作者:链条君,转载请注明原文链接:https://www.cnblogs.com/MacoLee/articles/6125671.html