Errno 32 multiprocessing.Queue管道损坏

时间:2018-07-29 09:18:13

标签: python queue multiprocessing pipe

我正在尝试抓取某些网页,并且每个网页大约需要2s,而我有2万,所以我决定使用 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]断管

p1.start()

我不明白为什么会这样。即使将 queueFill 函数修改为立即返回,该错误仍然会发生。有人可以帮助我了解为什么会发生此错误,以及如何解决该错误吗?

1 个答案:

答案 0 :(得分:1)

回答我自己的问题,以便将来的人们保持理智:

事实证明,多处理并不是真的喜欢在IPython / Jupyter笔记本中运行。将代码移到具有__name__检查的单独的独立脚本中后,输出将按预期进行。