Python 3.x 使用字典类型时多处理中的EOF错误?

Python 3.x 使用字典类型时多处理中的EOF错误?,python-3.x,python-multiprocessing,Python 3.x,Python Multiprocessing,下面这段代码正是我想要的。但是,对于文件大小更大的文件,它会中断并给我一个错误: 错误:“升高EOR” 现在我意识到,在我的多进程可以写回结果之前,我的主进程正在关闭,但我无法解决它。我已经在使用p.join()优雅地关闭进程。我尝试将p.close()放在p.join()之前,但随后出现错误:“'Process'对象没有属性'close'” 我能做些什么来解决这个问题 错误: 2020-10-01T15:55:22.488-05:00 item = in_queue.get() 2020

下面这段代码正是我想要的。但是,对于文件大小更大的文件,它会中断并给我一个错误:

错误:“升高EOR”

现在我意识到,在我的多进程可以写回结果之前,我的主进程正在关闭,但我无法解决它。我已经在使用p.join()优雅地关闭进程。我尝试将p.close()放在p.join()之前,但随后出现错误:“'Process'对象没有属性'close'”

我能做些什么来解决这个问题

错误:

2020-10-01T15:55:22.488-05:00   item = in_queue.get()

2020-10-01T15:55:22.488-05:00   File "<string>", line 2, in get

2020-10-01T15:55:22.488-05:00   File "/opt/python3.6/lib/python3.6/multiprocessing/managers.py", line 757, in _callmethod

2020-10-01T15:55:22.488-05:00   kind, result = conn.recv()

2020-10-01T15:55:22.488-05:00   File "/opt/python3.6/lib/python3.6/multiprocessing/connection.py", line 250, in recv

2020-10-01T15:55:22.488-05:00   buf = self._recv_bytes()

2020-10-01T15:55:22.488-05:00   File "/opt/python3.6/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes

2020-10-01T15:55:22.488-05:00   buf = self._recv(4)

2020-10-01T15:55:22.488-05:00   File "/opt/python3.6/lib/python3.6/multiprocessing/connection.py", line 383, in _recv

2020-10-01T15:55:22.488-05:00   raise EOFError

2020-10-01T15:55:22.488-05:00   EOFError
2020-10-01T15:55:22.488-05:00 item=in_queue.get()
2020-10-01T15:55:22.488-05:00文件“”,第2行,在get中
2020-10-01T15:55:22.488-05:00文件“/opt/python3.6/lib/python3.6/multiprocessing/managers.py”,第757行,在调用方法中
2020-10-01T15:55:22.488-05:00种类,结果=控制室
2020-10-01T15:55:22.488-05:00文件“/opt/python3.6/lib/python3.6/multiprocessing/connection.py”,第250行,在recv中
2020-10-01T15:55:22.488-05:00 buf=self.\u recv\u bytes()
2020-10-01T15:55:22.488-05:00文件“/opt/python3.6/lib/python3.6/multiprocessing/connection.py”,第407行,以字节为单位
2020-10-01T15:55:22.488-05:00 buf=self.\u recv(4)
2020-10-01T15:55:22.488-05:00文件“/opt/python3.6/lib/python3.6/multiprocessing/connection.py”,第383行,在
2020-10-01T15:55:22.488-05:00提高采收率
2020-10-01T15:55:22.488-05:00 EOFError
现在我意识到我的主进程是在我的多进程之前结束的 可以写回结果,但我无法解决它

所以这似乎不是一个输入文件大小的问题,而是一个更大的处理过程,它只需要花费更多的时间和您是否愿意提前终止主程序?或者由于某种原因,您选择在处理完成之前退出主进程。听起来你需要一种额外的适当的取消形式,在你离开之前阻止工人

我已经在使用p.join()优雅地关闭进程

Process.join()。它只意味着在工作进程列表选择终止之前,特定的作用域一直处于阻塞状态。如果出于任何原因,您使用
键盘中断关闭应用程序,或者在另一个线程中运行时告诉主线程退出,则当您尝试从父进程读取更多工作项时,主进程将终止,子进程将遇到EOF

主进程和子进程的实现是以这样一种方式设置的:队列上的所有工作进程都将被发送
None
值,以发出退出信号,然后取消阻止主进程中的所有
进程。join()
调用。如果在该点之前未向每个工作人员发送
None
,并且您退出main,则可能会遇到EOF问题,因为工作人员尚未停止

我尝试将p.close()放在p.join()之前,但随后出现错误:“'Process'对象没有属性'close'”


“3.7版中的新版本。”

这意味着您正在运行低于3.7的python版本。但是如果您的主进程要提前退出,您可以调用
terminate
kill
。最好停止向工作人员发送行,并发送最后的
None
值以使工作人员正常停止,然后使用
join()
调用等待他们

with open(file_name) as f:
    num_lines = 0
    iters = itertools.chain(f, (None,) * 10)
    for num_and_line in enumerate(iters):
        work.put(num_and_line)
            num_lines += 1
这段代码在每一行上迭代,将其发送到队列,最后为每个工作进程发送一个
None
值(本例中为10)。如果决定取消工作,则需要停止发送行,而是发送10个
None
值,然后中断


要了解更多详细信息,您需要描述您的取消情况。

如果我使用字典而不是结果列表,will会在遇到空行时从函数co发送None,仍然是优雅的关闭方式吗?结果的收集发生在您的工作人员从队列接收到一个值并决定在看到
时返回之后。因此,存储结果的方式的选择与队列和出口无关。但另一方面,仅仅为了排序行而选择使用dict是不可靠的。Python dict不保证键被排序。它只是碰巧是CPython dict的一个幸运的实现细节,您的整数键最终显示为已排序。列表将通过作为行号的索引来维护排序顺序。
with open(file_name) as f:
    num_lines = 0
    iters = itertools.chain(f, (None,) * 10)
    for num_and_line in enumerate(iters):
        work.put(num_and_line)
            num_lines += 1