我正在尝试抓取一些网页,考虑到每个网页大约需要2秒,而我有20k个,我决定使用多处理库创建多个进程来同时抓取网页。
我的设置是一个pandas数据帧,其中包含以前解析的数据和一个"新数据"字典。由于我不知道是需要刮取网页还是已经刮取了网页,我创建了一个multiprocessing.Queue实例,以及一个multiprocession.Manager.dict((。我有一个函数queueFill,用于验证数据是否在数据帧中,如果不在,则将有问题的链接放置在多处理中。队列实例。还有一个函数可以从多处理中获取项目。队列,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()
然而,运行此操作会导致线路上出现[Erno 32]管道破裂:
p1.start()
我不明白为什么会发生这种事。即使queueFill函数被修改为立即返回,错误仍然会发生。有人能帮我理解为什么会发生这个错误,以及我应该如何修复它吗?
回答我自己的问题,让未来的人保持理智:
事实证明,多处理并不喜欢在IPython/Jupyter笔记本上运行。在使用__name__检查将代码移动到一个单独的独立脚本后,输出如预期。