- 比线程所需的资源更少
- 可以用yield 实现多任务,其实是并发,但速度很快,相当于同时进行
import time def test1(): while True: print('——1——') yield def test2(): while True: print('——2——') yield def main(): t1= test1() t2= test2() while True: next(t1) next(t2) if __name__ == '__main__': main()
- 可以用 greenlet 来执行, greenlet 其实对yield的更高级封装
import time import greenlet def test1(): while True: print("——1——") g2.switch() def test2(): while True: print("——2——") g1.switch() g1= greenlet.greenlet(test1) g2= greenlet.greenlet(test2) g1.switch()
- 虽然 greenlet 也可以实现多任务,但还是用 gevent ,因为如果用 greenlet ,函数里如果延时,那么下个指令就不会执行,但 gevent 遇到延时时会自己切换任务,而且是自己的延时 gevent.sleep()
但是如果已经写好了实在不想换,在最前面加 monkey.patch_all() 这样就可以用 time.sleep() 了,不过要在前面from gevent import monkey,不能单纯的导入gevent 不然会报错 - 到最后依然需要用 join来等待结束,但可以用joinall(列表)来代替每一个join
import gevent import time from gevent import monkey monkey.patch_all() def f1(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) # 在写入monkey.patch_all()后 可以代替geven.sleep() # gevent.sleep(0.5) def f2(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) # gevent.sleep(0.5) def f3(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) # gevent.sleep(0.5) print("——1——") g1 = gevent.spawn(f1,5) print("——2——") g2 = gevent.spawn(f2,5) print("——3——") g3 = gevent.spawn(f3,5) # g1.join() 可以用joinall代替 # g2.join() # g3.join() gevent.joinall([ gevent.spawn(f1,5), gevent.spawn(f2,5), gevent.spawn(f3,5), ])