最近项目要用到协程,以前的都忘了大半了,现在从新捡起来测试下,这里做下记录(机器是centos6.9 2G2核, python2.7.12):
1.简单应用:
import gevent
import gevent.monkey
gevent.monkey.patch_all()
def call(x):
time.sleep(3)
return x
class Test_call(object):
def __init__(self, num):
self.num = num
def call(self):
time.sleep(3)
print self.num
if __name__ == '__main__':
start_time = time.time()
gevenlets = []
for i in range(200):
a = Test_call(i)
gevenlets.append(gevent.spawn(a.call))
try:
gevent.joinall(gevenlets)
except Exception, e:
print str(e)
print 'time: {0}'.format(str(time.time() - start_time))
最后运行时间是: time: 3.02329182625
2.协程+多任务调度(模拟生成者与消费者模型):
import time
import gevent
import Queue
import random
import gevent.monkey
gevent.monkey.patch_all()
queue = Queue.Queue()
def do_work(x):
time.sleep(3)
print x
def worker():
while True:
item = queue.get()
try:
do_work(item)
finally:
queue.task_done()
def produce():
while True:
time.sleep(5)
num = random.randint(0, 10)
for item in range(num):
queue.put(item)
gevents = []
gevents.append(gevent.spawn(produce))
for i in range(200):
gevents.append(gevent.spawn(worker))
try:
gevent.joinall(gevents)
except Exception, e:
print str(e)
这个几乎满足需求了,测试到此为止了.