协程之生产消费队列
#!/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模拟阻塞是不管用的。