python中gevent協程庫

One of them發表於2018-08-24

gevent協程庫使用

"""
    gevent 比 greenlet 更強. 協程庫
   協程是單執行緒, 遇到time.sleep() 是不能切換的.

   gevent基於greenlet, 不需要手動切換, 遇到阻塞自動切換. 但是越到延時不切換.
   gevent.sleep(2)  模擬阻塞, 會切換.
   gevent.spawn(func)  啟動協程物件.
   gevent.joinall(list)    等待指定的greenlet走完, 再走.
"""
import time
import gevent
import random
from gevent.queue import Queue

q = Queue(2)


def consumer():
    while True:
        item = q.get()
        print("consumer {}".format(item))
        time.sleep(2)  # 會延時.


def producer():
    while True:
        item = random.randint(0, 99)  # 0到99的隨機整數.
        q.put(item)
        print("producer {}".format(item))
        time.sleep(2)


p = gevent.spawn(producer)  # 啟動協程. 還可以 , + 函式引數.
c = gevent.spawn(consumer)
gevent.joinall([p, c])  # 阻塞當前流程, 執行完給定的greenlet, 才繼續走.

相關文章