Luo Weifeng 2011-8-28
話說, 北京的天氣還算很悶熱, 星期天一隊人馬跑來公司噌網, 也能是年輕氣盛,發正沒老婆沒孩子的, 在住處獃著也不爽, 開vpn也很慢,乾脆就來公司了。
好, 廢話就說這麼多, 這裡我介紹一個python的一個非同步並發庫:gevent。
gevent is a Python networking library that uses greenlet to
provide a synchronous API on top oflibevent event
loop.
具體的可以參見: http://www.gevent.org/intro.html
前面我也蜻蜓點水似的介紹過greenlet 和 libevent, 這裡再解釋一下, libevent就是個事件分發的引擎, greenlet提供了輕量級‘線程’支援(其實不是線程,就是greenlet context)。 按照官網的這個說法, gevent就是基於這兩個東西的一個專門處理網路邏輯的並行庫。 看一個例子就很容易明白。
concurrent_download.py
#!/usr/bin/python# Copyright (c) 2009 Denis Bilenko. See LICENSE for details."""Spawn multiple workers and wait for them to complete"""urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']import geventfrom gevent import monkey# patches stdlib (including socket and ssl modules) to cooperate with other greenletsmonkey.patch_all()import urllib2def print_head(url): print ('Starting %s' % url) data = urllib2.urlopen(url).read() print ('%s: %s bytes: %r' % (url, len(data), data[:50]))jobs = [gevent.spawn(print_head, url) for url in urls]gevent.joinall(jobs)
這裡的代碼很簡單,就是對urls裡邊的網址進行並行抓取,再列印出各自的資訊, 這裡要說的是 from gevent import monkey 這個monkey是第三方的替代庫, 就是安全的將python內建的socket 和ssl模組使用 第三方更快的庫來替代, 傳說速度提高好多倍。這裡的gevent.spawn 其實就是對greenlet.start 的一個helper封裝。 gevent.greenlet 有對greenlet的支援, 所以可以放心使用, 而gevent中不像純greenlet那樣需要我們自己手動的指定運行流程,它自己隨機的幫我們處理。