协程之生产消费队列

209 阅读1分钟

协程之生产消费队列

#!/usr/bin/env python2.7
# -*- conding: utf-8 -*-
# @Time : 2020/10/27 11:53
# @Author : ada
# @file : callback_gevent.py
# @Project: test2 

import gevent
from gevent.queue import Queue
import time

tasks = Queue()
def worker(n):
    #while not tasks.empty():
    while True:
        task = tasks.get()
        print('Worker %s got task %s' % (n, task))
        gevent.sleep(2)  # 因为工作进程也阻塞才会切换到其它worker工作,这里有三个worker1-3
        print('Quitting time!')

def boss():
    while True:
        for i in xrange(1,25):
            tasks.put(i)
            gevent.sleep(0)  # 必须有要此句,才会让生产阻塞,才得已切换到消费协程工作


#gevent.spawn(start).join()
#gevent.spawn(boss).join()

gevent.joinall([
    gevent.spawn(boss),
    gevent.spawn(worker, 'worker1'),
    gevent.spawn(worker, 'worker2'),
    gevent.spawn(worker, 'worker3'),
])





协程切换机制

主要是检测io阻塞才会切换,另外应该是要由gevent.spawn监听的第一层函数才能检测到阻塞。 如果用time.sleep模拟阻塞是不管用的。