【发布时间】:2014-10-22 20:20:28
【问题描述】:
我有一个程序可以创建一个多处理池来处理 Web 提取作业。本质上,产品 ID 的列表被输入到一个由 10 个处理队列的进程组成的池中。代码很简单:
import multiprocessing
num_procs = 10
products = ['92765937', '20284759', '92302047', '20385473', ...etc]
def worker():
for workeritem in iter(q.get, None):
time.sleep(10)
get_product_data(workeritem)
q.task_done()
q.task_done()
q = multiprocessing.JoinableQueue()
procs = []
for i in range(num_procs):
procs.append(multiprocessing.Process(target=worker))
procs[-1].daemon = True
procs[-1].start()
for product in products:
time.sleep(10)
q.put(product)
q.join()
for p in procs:
q.put(None)
q.join()
for p in procs:
p.join()
get_product_data() 函数获取产品,打开 Selenium 实例,导航到站点,登录并收集产品详细信息并输出到 csv 文件。问题是,随机(字面意思......它发生在网站导航或提取过程的不同点)Selenium 将停止做它正在做的任何事情,只是坐在那里停止做它的工作。不会抛出异常或任何东西。我已经在get_product_data() 函数中尽我所能避免这种情况发生,但这似乎只是 Selenium 的一个问题(我尝试使用 Firefox、PhantomJS 和 Chrome 作为它的驱动程序,但仍然遇到无论如何,同样的问题)。
基本上,该过程的运行时间不应超过 10 分钟。如果进程运行时间超过指定时间,是否有任何方法可以杀死进程并使用相同的产品 ID 重新启动它?
这一切都在使用 Python 2.7 的 Debian Wheezy 机器上运行。
【问题讨论】:
标签: python selenium multiprocessing