我似乎无法弄清楚为什么我的基于队列的生产者/消费者进程无限期地阻塞和执行:
def producer(q,urls):
for url in urls:
thread = ThreadChild(Profile.collection,Profile.collection,url,True)
thread.follow_links = follow
thread.start()
q.put(thread,True)
log.info('Done making threads')
def consumer(q,total_urls):
thread = q.get(True)
thread.join(timeout=40.0)
q.task_done()
q = Queue(2)
prod_thread = threading.Thread(target=producer, args=(q, urls))
cons_thread = threading.Thread(target=consumer, args=(q, len(urls)))
prod_thread.start()
cons_thread.start()
prod_thread.join(timeout=60.0)
cons_thread.join(timeout=60.0)
我已经尝试在生产者和消费者线程上设置超时,以及生成器生成的子进程,并且该进程仍然无限期地运行。
ThreadChild
是一个执行一些简单网络作业的过程,直到它用完要处理的URL。线程不应该花很长时间才能执行。 var urls
只是要处理的线程的URL列表。值得注意的是,“完成制作线程”的日志从不打印(log
是绑定到StreamHandler
的std python记录器。)
生成器和消费者线程定义的超时不应该在60秒后终止所有内容,无论队列中剩下什么?我是否误解了这些方法的使用并将结果添加到队列的错误方式?