【发布时间】:2015-11-04 20:50:17
【问题描述】:
我正在尝试让一些代码工作,我可以在其中使用 gevent 实现登录到多线程程序。我想做的是设置自定义日志处理程序以将日志事件放入队列中,同时侦听器进程不断监视新的日志事件以进行适当处理。我过去曾使用 Multiprocessing 完成此操作,但从未使用 Gevent。
我遇到了一个问题,即程序陷入无限循环(侦听器进程),并且不允许其他线程“工作”...
理想情况下,在工作进程完成后,我可以将任意值传递给监听进程,告诉它中断循环,然后将所有进程连接在一起。这是我目前所拥有的:
import gevent
from gevent.pool import Pool
import Queue
import random
import time
def listener(q):
while True:
if not q.empty():
num = q.get()
print "The number is: %s" % num
if num <= 100:
print q.get()
# got passed 101, break out
else:
break
else:
continue
def worker(pid,q):
if pid == 0:
listener(q)
else:
gevent.sleep(random.randint(0,2)*0.001)
num = random.randint(1,100)
q.put(num)
def main():
q = Queue.Queue()
all_threads = []
all_threads = [gevent.spawn(worker, pid,q) for pid in xrange(10)]
gevent.wait(all_threads[1:])
q.put(101)
gevent.joinall(all_threads)
if __name__ == '__main__':
main()
正如我所说,程序似乎挂断了第一个进程,并且不允许其他工作人员做他们的事情。我也尝试过完全独立地生成侦听器进程(这实际上是我更愿意这样做),但这似乎也不起作用,所以我尝试了这种方式。
任何帮助将不胜感激,感觉我可能只是遗漏了一些关于 gevent 后端的明显内容。
谢谢
【问题讨论】:
标签: python logging queue gevent