【发布时间】:2018-07-29 09:18:12
【问题描述】:
我正在尝试抓取一些网页,考虑到每个网页大约需要 2 秒,而我有 20k 个网页,我决定使用 multiprocessing 库创建多个进程来同时抓取网页。
我的设置是一个带有以前解析过的数据和一个“新数据”字典的 pandas 数据框。由于我不知道是需要抓取网页还是已经抓取了网页,所以我创建了一个 multiprocessing.Queue 实例以及一个 multiprocessing.Manager.dict()强>。我有一个函数,queueFill,它验证数据是否在数据框中,如果没有,则将有问题的链接放在 multiprocessing.Queue 实例中。还有一个函数可以从 multiprocessing.Queue 中获取项目,getData,它从队列中获取一个链接,下载并解析它并将其添加到“新数据”字典中。
我正在尝试创建一个执行 queueFill 函数的进程和一个执行 getData 函数的进程:
manager = multiprocessing.Manager()
newPlayersDict = manager.dict()
errorsDict = manager.dict()
i=0
linklen = str(len(linklist))
q = multiprocessing.Queue()
if 'playersDF' in globals():
p1 = multiprocessing.Process(target=queueFill,args=(playersDF,q,linklist))
else:
p1 = multiprocessing.Process(target=queueFill,args=(None,q,linklist))
p2 = multiprocessing.Process(target=getData,args=(q,newPlayersDict,errorsDict,linklen,i))
time.sleep(0.5)
p1.start()
p2.start()
p1.join()
p2.join()
但是,运行它会给我一个 [Errno 32] Broken pipe 就行了:
p1.start()
我不明白为什么会这样。即使将queueFill函数修改为立即返回,错误依然存在。有人可以帮我理解为什么会发生这个错误,以及我应该如何解决它?
【问题讨论】:
标签: python queue multiprocessing pipe