gevent.spawn會對傳入的子任務集合進行調度,gevent.joinall 方法會阻塞當前程序,除非所有的greenlet都執行完畢,才會退出程序
公有方法 | |
gevent.spawn(cls, *args, **kwargs) | 創建一個Greenlet對象,其實調用的是Greenlet.spawn(需要from gevent import Greenlet),返回greenlet對象 |
gevent.joinall(greenlets, timeout=None, raise_error=False, count=None) | 等待所有greenlets全部執行完畢, greenlets為序列,timeout為超時計時器對象,返回執行完畢未出錯的的greenlet序列 |
greenlet | |
g.join() | 等待此協程執行完畢后 |
注意: 多條gevent.spawn(cls, *args, **kwargs).join()語句即使為阻塞調用也不會協程式調用,因為生成的Greenlet對象執行完就消失,所有要實現協程式調用可通過gevent.joinall(greenlets, timeout=None, raise_error=False, count=None)或是賦值到一變量后再對此對象調用.join(),其中一個特殊的方式就是for循環調用將隱式的賦值對象調用,會自動變為協程式運行.
# coding:utf-8 import gevent import random def task(pid): gevent.sleep(random.randint(0,2)*0.001) print('task %s done'%pid) def synchronous(): for i in range(1, 10): task(i) def asynchronous(): threads = [gevent.spawn(task, i) for i in xrange(10)] # print(threads) # spawn將task函數封裝到greenlet內部線程 gevent.joinall(threads) # gevent.joinall 阻塞當前流程 並執行所有給定的greenlet 執行完繼續往下走 print('Synchronous') synchronous() print('Asynchronous') asynchronous()
# coding:utf-8 import gevent.monkey gevent.monkey.patch_socket() import gevent import urllib2 import json def fetch(pid): response = urllib2.urlopen('http://www.baidu.com') result = response.read() print('Process %s: %s' % (pid, result)) def synchronous(): for i in range(1, 10): fetch(i) def asynchronous(): threads = [] for i in range(1,10): threads.append(gevent.spawn(fetch, i) for i in xrange(10)) # spawn將task函數封裝到greenlet內部線程 gevent.joinall(threads) print('Synchronous') synchronous() print('Asynchronous') asynchronous()
#coding:utf-8 import gevent import gevent.monkey gevent.monkey.patch_all() # spawn_later函數可接收周期時間及運行函數。 INTERVAL = 10 def schedule(delay, func, *args, **kw_args): gevent.spawn_later(1, func, *args, **kw_args) gevent.spawn_later(delay, schedule, delay, func, *args, **kw_args) def test1(): print "func test1" def test2(): print "func test2" def test3(): print "test3" schedule(1,test1) schedule(2,test2) schedule(3,test3) while 1: gevent.sleep(1)