【问题标题】:Errno 32 Broken pipe error with multiprocessing.QueueErrno 32 使用 multiprocessing.Queue 的管道损坏错误
【发布时间】: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


    【解决方案1】:

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

    事实证明,多处理并不真正喜欢在 IPython/Jupyter 笔记本中运行。使用 __name__ 检查将代码移动到单独的独立脚本后,输出符合预期。

    【讨论】:

      猜你喜欢
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2021-01-04
      • 2017-04-22
      • 2013-04-16
      • 2021-10-11
      相关资源
      最近更新 更多