【发布时间】:2013-09-09 17:25:53
【问题描述】:
我下面的例程获取 urllib2.Requests 列表,并为每个请求生成一个新进程并将它们关闭。目的是为了异步速度,所以这一切都是一劳永逸的(不需要响应)。问题是下面代码中产生的进程永远不会终止。因此,在其中一些之后,盒子就会OOM。上下文:Django 网络应用程序。有什么帮助吗?
MP_CONCURRENT = int(multiprocessing.cpu_count()) * 2
if MP_CONCURRENT < 2: MP_CONCURRENT = 2
MPQ = multiprocessing.JoinableQueue(MP_CONCURRENT)
def request_manager(req_list):
try:
# put request list in the queue
for req in req_list:
MPQ.put(req)
# call processes on queue
worker = multiprocessing.Process(target=process_request, args=(MPQ,))
worker.daemon = True
worker.start()
# move on after queue is empty
MPQ.join()
except Exception, e:
logging.error(traceback.print_exc())
# prcoess requests in queue
def process_request(MPQ):
try:
while True:
req = MPQ.get()
dr = urllib2.urlopen(req)
MPQ.task_done()
except Exception, e:
logging.error(traceback.print_exc())
【问题讨论】:
-
当真时:- 有终止?
-
我尝试了几种不同的方法来解决这个问题,包括终止()、重新定义全局变量、休眠和终止、加入()和不加入()。到目前为止,唯一有效的方法是执行 time.sleep(1) 和 worker.terminate() ,但这会中断进程并且在数千个潜在请求中休眠是行不通的:(
-
并回答您的问题:当队列清空时满足 True (我知道,这不是很直观)。
-
except Queue.Empty,e: logging.info('task done'); except Exception, e: logging.error(traceback.print_exc()) -
你的解决方案不好,我建议使用大共享池和map_async而不是队列。
标签: python django process multiprocess