我有一个生成进程的主进程,然后这些进程将作业添加到队列中,主进程使用该队列生成更多进程。而且,在大约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_线程()引发断言错误。在
好的,我修好了。我的第一个预感是,排队的人在写作时被扼杀了。但是,在使用队列.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()
相关问题 更多 >
编程相关推荐