python协程
python协程
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。
协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;
greenlet
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from greenlet import greenlet 4 5 6 def test1(): 7 print 12 8 gr2.switch() 9 print 34 10 gr2.switch() 11 12 13 def test2(): 14 print 56 15 gr1.switch() 16 print 78 17 18 gr1 = greenlet(test1) 19 gr2 = greenlet(test2) 20 gr1.switch()
gevent
1 import gevent 2 3 def foo(): 4 print('Running in foo') 5 gevent.sleep(0) 6 print('Explicit context switch to foo again') 7 8 def bar(): 9 print('Explicit context to bar') 10 gevent.sleep(0) 11 print('Implicit context switch back to bar') 12 13 gevent.joinall([ 14 gevent.spawn(foo), 15 gevent.spawn(bar), 16 ])
遇到IO操作自动切换:
1 from gevent import monkey; monkey.patch_all() 2 import gevent 3 import urllib2 4 5 def f(url): 6 print('GET: %s' % url) 7 resp = urllib2.urlopen(url) 8 data = resp.read()// 遇到IO操作自动切换: 9 print('%d bytes received from %s.' % (len(data), url)) 10 11 gevent.joinall([ 12 gevent.spawn(f, 'http://www.php100.com/manual/jquery/'), 13 gevent.spawn(f, 'https://www.baidu.com/'), 14 gevent.spawn(f, 'https://www.jd.com/'), 15 ])
浙公网安备 33010602011771号