Python队列似乎正在消亡

Python队列似乎正在消亡,python,queue,multiprocessing,Python,Queue,Multiprocessing,我有一个生成进程的主进程,然后这些进程将作业添加到主进程用来生成更多进程的队列中。而且,这可以正常工作大约20秒,然后主进程停止生成作业,即使队列中有大量作业 以下是作业流程的运行循环代码: try: page = self.fetch_page(self.url, self.timeout) if page != None: #do_stuff pass except Exception, e:

我有一个生成进程的主进程,然后这些进程将作业添加到主进程用来生成更多进程的队列中。而且,这可以正常工作大约20秒,然后主进程停止生成作业,即使队列中有大量作业

以下是作业流程的运行循环代码:

try:
    page = self.fetch_page(self.url, self.timeout)
    if page != None:
        #do_stuff
        pass 
except Exception, e:                           #Log any errors
    import traceback
    self.log(str(traceback.format_exc(limit=10)), level="error")
    self.log(str(e), level="error")
finally:
    import os, signal
    print "releasing Semaphore"
    self.__sem.release()
    #print "Joining pQueue" #these statements raise errors...
    #self.__pqueue.join_thread()
    #print "Joining lQueue"
    #self.__log.join_thread()
    print "exiting"
    os._exit(1)
    #os.kill(self.pid, signal.SIGTERM)
下面是生成作业的主进程的代码:

while True:
    print "Waiting for url"
    url = self.page_queue.get()
    print "waiting for semaphore"
    self.__sem.acquire()
    print "semaphore recived"
    process = self.process_handler(url, self.log_queue, self.__sem, self.page_queue)
    process.start()
只需要一点上下文,生成过程中的self.log\u队列是self.\u作业过程中的self.page\u队列是self.\u pqueue,作业过程中的self.\u sem与self.\u sem相同

喷射过程通常挂起在:

url = self.page_queue.get()

我很确定这与当作业进程在完成对队列的写入之前终止时队列中断有关,不过这只是一种预感。和self.\uuupqueue.join\u thread()会引发断言错误。

不确定这是否有用,但您的self.page\u队列是否是队列的实例(http://docs.python.org/library/queue.html),则默认情况下get()是阻塞的。您是否已验证队列不是空的?它可能只是挂在等待一个项目。我记得当我使用队列时,这件事困扰着我


此外,它不会加入到你为GET()所做的每一个任务中,你已经调用了TaskStONE()

< P>如果你正在抓取网页,那么你应该考虑使用EvestLoad库来代替多个进程。如果要进行大量计算,将进程拆分为多个进程非常有用。然而,你可能会花大部分时间等待你的互联网连接。因此,启动进程的额外开销被浪费了


Eventlet在协作线程模型上工作,使编写此类应用程序变得更加容易。

好的,我已经修复了它。我的第一个预感是队列在写入时被杀死了。但是,在使用queue.qsize()检查并确保队列中有值之后,我开始认为是信号量导致了问题。所以我研究了多处理管理器对象,这些对象允许进程通过“代理”操作数据。因此,我切换了逻辑,这样所有的队列和信号量都将由管理器对象控制,这似乎很好地解决了问题。链接到适用的python文档:

信号量是如何实例化的?如果初始值太小,您将无法处理许多进程。您如何知道队列中有大量作业?@Cedric Julien它在主进程中初始化,然后作为参数传递给进程。它初始化为5@WinstonEwert所有添加的作业都将与创建的进程一起记录,并且作业的数量比进程的数量大,约为1个进程生成的数量与添加的100个作业的数量之比。我建议您使用非阻塞队列逻辑替换队列,并在每次迭代时打印队列的内容看看里面有没有东西。我试试队列。空的东西。就程序运行而言,它使用的是多处理队列,而不是queue.queue对象,因此没有task_done()eventlet看起来很酷,当时我还没有意识到。我一定会查清楚的+1.