我正在尝试抓取一些网页,并且每个网页大约需要2s,而我有20k,所以我决定使用多处理库创建多个进程来同时抓取该网页。
我的设置是一个带有以前解析的数据和“新数据”字典的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函数修改为立即返回,该错误仍然会发生。有人可以帮助我了解为什么会发生此错误,以及我应该如何解决?
最佳答案
要回答我自己的问题,以便将来的人们保持理智:
事实证明,多处理并不是真的喜欢在IPython / Jupyter笔记本中运行。通过__name__检查将代码移动到单独的独立脚本后,输出将达到预期的效果。
关于python - Errno 32 multiprocessing.Queue管道损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51578894/