Я пытаюсь получить некоторый код, работающий там, где я могу реализовать вход в многопоточную программу с помощью gevent. То, что я хотел бы сделать, - настроить пользовательские обработчики ведения журнала, чтобы помещать события журнала в очередь, в то время как процесс прослушивания постоянно следит за тем, чтобы новые события журнала обрабатывались надлежащим образом. Я делал это в прошлом с Multiprocessing, но никогда с Gevent.Python Gevent Shared Queue (процесс прослушивания)
У меня проблема, когда программа попасться в бесконечном цикле (процесс слушателя), а не позволяя другим потокам «работают» ...
В идеале, после того, как рабочие процессы закончили, я могу передать произвольное значение процессу слушателя, чтобы сообщить ему разбить цикл, а затем объединить все процессы вместе. Вот то, что я до сих пор:
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.
Благодаря