python——協程


  由於python中的多線程比較特殊,所以協程的概念就變得尤為珍貴了,對於cpu密集型的操作,使用協程的效率無疑要好過多線程很多。因為協程的創建及其間切換的時間成本要低於線程很多。也因為這一點,很多人說,協程才是python的未來,重要不重要!!!

  python中提供協程的模塊有兩個,greenlet和gevent。greenlet和gevent最大的區別在於greenlet需要你自己來處理線程切換, 就是說,你需要自己指定現在執行哪個greenlet再執行哪個greenlet。ps:這兩個包都不是python自帶的,所以需要手動安裝一下,pip就可以輕松搞定!

        

  左側圖是greenlet的用法,我已經將執行順序標注出來了,從圖中我們不難看出greenlet的執行順序是需要我們手動控制的,現在再看看右側的圖是gevent的用法,就智能多了,它不需要我們自己去支配,只要一個協程稍有空閑,gevent就幫你進行切換,已達到cpu的最大利用率。

 1 #!/usr/bin/env python 
 2 # -*- coding:utf-8 -*-
 3 __author__ = 'Eva_J'
 4 
 5 from greenlet import greenlet
 6   
 7 def test1(): 
 8     print 12
 9     gr2.switch() 
10     print 34
11     gr2.switch() 
12   
13   
14 def test2(): 
15     print 56
16     gr1.switch() 
17     print 78
18   
19 gr1 = greenlet(test1) 
20 gr2 = greenlet(test2) 
21 gr1.switch() 
greenlet Code
 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 example1 Code

  這里再贈送一個gevent遇到IO操作自動切換的例子,這段代碼一看就是一副高大上的樣子,從老師那里偷來的,嘻:

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 __author__ = 'Eva_J'
 4 
 5 from gevent import monkey; monkey.patch_all()
 6 import gevent
 7 import urllib2
 8 
 9 def f(url):
10     print('GET: %s' % url)
11     resp = urllib2.urlopen(url)
12     data = resp.read()
13     print('%d bytes received from %s.' % (len(data), url))
14 
15 gevent.joinall([
16         gevent.spawn(f, 'https://www.python.org/'),
17         gevent.spawn(f, 'https://www.yahoo.com/'),
18         gevent.spawn(f, 'https://github.com/'),
19 ])
gevent example2 Code

參考文獻:

    python的線程進程和協成:http://www.cnblogs.com/wupeiqi/articles/5040827.html

      greenlet背景介紹與實現機制:http://blog.jobbole.com/77240/

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM