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()
greenlet


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 ])
gevent


遇到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 ])
遇到IO操作自动切换

 





posted on 2016-02-25 13:18  曦字号  阅读(156)  评论(0)    收藏  举报

导航