协程:当一个线程执行某一任务时,若产生IO延迟,跳转去执行另外一个任务。
一、greenlet
from greenlet import greenlet g = greenlet() g.switch() # 手动实现协程
实现协程的基本功能模块是greenlet,通过switch方法可手动实现协程,比较原始和复杂。
二、gevent
实现协程的高级模块,内部也是依靠greenlet实现的,可以非常高效的提高代码性能。
(一)手动切换进程
使用 gevent.sleep(0) 手动控制切换,不常用。
# 关于python协程:IO延迟时使用 import gevent import time def foo(): print('running foo:') gevent.sleep(0) # 手动切换进程的标识 print('over foo.') def bar(): print('running bar:') gevent.sleep(0) print('over bar.') gevent.joinall([gevent.spawn(foo),gevent.spawn(bar)])
(二)自动切换进程
使用 monkey 模块的 monkey.patch_all 方法,实现进程的自动切换。
# ***协程实例: from gevent import monkey; monkey.patch_all() import gevent import requests def f(url): print('GET: %s' %url) resp = requests.get(url) data = resp.text print(url,len(data)) gevent.joinall([gevent.spawn(f,'https://www.python.org/'), gevent.spawn(f,'https://www.yahoo.com/'), gevent.spawn(f,'https://www.github.com/'), ])
浙公网安备 33010602011771号