协程,又称微线程,纤程。英文名 Coroutine.一句话说明什么是协程: 协程是一种用户态的轻量级线程。python
协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,git
恢复先前保存的寄存器上下文和栈。所以:协程能保留上一次调用时的状态(即全部局部状态的一个特定组合)github
每次过程重入时,就至关于进入上一次调用的状态。换种说法,进入上一次离开时所处逻辑流的位置编程
无需线程上下文切换的开销并发
import time import queue def consumer(name): print('--------------start------------') while True: new_baozi = yield print('%s is eating baozi %s' %(name,new_baozi)) time.sleep(1) def producer(): r = con.__next__() #也能够是Next(con) r = con2.__next__() n =0 while n < 5: n += 1 con.send(n) con2.send(n) print("\033[32;1m[producer]\033[0m is making baozi %s" % n) if __name__ == "__main__": con = consumer('c1') con2 = consumer('c2') p = producer()
from greenlet import greenlet def test1(): print(12) gr2.switch() print(34) gr2.switch() def test2(): print(56) gr1.switch() print(78) gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch()
import gevent def foo(): print('Running in foo...') gevent.sleep(1) print('explicit context switch to foo again') def bar(): print('explicit context to bar') gevent.sleep(2) print('Implicit context switch back to bar') gevent.joinall([ gevent.spawn(foo), gevent.spawn(bar), ])
from urllib.request import urlopen from gevent import monkey import gevent import urllib def f(url): print('GET: %s' % url) resp = urllib.request.urlopen(url) data = resp.read() print('%d bytes received from %s.' % (len(data), url)) gevent.joinall([ gevent.spawn(f, 'https://www.python.org/'), gevent.spawn(f, 'https://www.yahoo.com/'), gevent.spawn(f, 'https://github.com/'), ])
加monkey.patch_all(),很快高并发
from urllib.request import urlopen from gevent import monkey monkey.patch_all() import gevent def f(url): print('GET: %s' % url) resp = urlopen(url) data = resp.read() print('%d bytes received from %s.' % (len(data), url)) gevent.joinall([ gevent.spawn(f, 'https://www.python.org/'), gevent.spawn(f, 'https://www.yahoo.com/'), gevent.spawn(f, 'https://github.com/'), ])