Python队列似乎正在消亡

2024-04-25 09:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个生成进程的主进程,然后这些进程将作业添加到队列中,主进程使用该队列生成更多进程。而且,在大约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)

下面是生成作业的主进程的代码:

^{pr2}$

只是一点背景,self.log_队列在生成过程中是self.\uu登录作业进程,self.page_队列在工作过程中是self.\u pqueue,而self.\u sem在作业过程中与self.\u sem相同。在

spawing过程通常挂在:

url = self.page_queue.get()

我很确定,这与作业进程在写入队列之前终止时队列中断有关,但这只是一种预感。还有自我__pqueue.join_线程()引发断言错误。在


Tags: 代码selflogurl队列进程os过程
3条回答

好的,我修好了。我的第一个预感是,排队的人在写作时被扼杀了。但是,在使用队列.qsize(),我开始认为是信号量造成了问题。所以我研究了多进程管理器对象,这些对象允许进程通过“代理”操作其数据。所以我切换了逻辑,这样所有的队列和信号量都将由管理器对象控制,这似乎已经完美地解决了。链接到适用的python文档:http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes

如果要按显示的方式获取网页,则应考虑使用eventlet库而不是多个进程。如果您要进行大量计算,那么将其拆分为多个进程是非常有用的。然而,你可能会花大部分时间等待你的互联网连接。因此,启动进程的额外开销被浪费了。在

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

不确定这是否有用,但如果self.page_队列是队列的实例(http://docs.python.org/library/queue.html),则get()在默认情况下是阻塞的。你确认队列不是空的吗?它可能只是在等待一个项目。我记得当我使用队列时,这种情况一直困扰着我。在

此外,它不会加入,直到您为每个任务执行get()时,都调用task\u done()

相关问题 更多 >