- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
阅读关于这个主题的几个问题,我现在明白子进程从父进程继承文件描述符。这将使 child 在 parent 关闭连接时更难收到 EOFError。
但我的情况正好相反,我不明白我面临的问题。
我有一个启动子进程的父进程,并允许它访问我创建的管道连接的一端。现在,当子进程完成、出现故障或其他任何情况时,一切都会停止并且连接会关闭。此时子进程显示已失效。
然后我希望父进程的连接在阻塞的 recv 调用上抛出 EOFError。但它只是坐在那里等待。
我在这里错过了什么?
编辑
我认为这个例子代表了问题:
from multiprocessing import Process, Pipe
from threading import Thread
import time
class Parent(object):
def __init__(self):
self.parent_conn, child_conn = Pipe()
self.child = Process(target=Child, args=(child_conn,))
self.child.start()
def recv():
try:
self.parent_conn.recv()
except EOFError:
print "EOF"
except:
print "something else"
# Does not work
recv()
# Works fine
t = Thread(target=recv)
t.setDaemon(True)
t.start()
def close(self):
self.parent_conn.close()
self.child.join()
class Child(object):
def __init__(self, conn):
conn.close()
if __name__ == "__main__":
p = Parent()
time.sleep(1)
p.close()
如果我确实使用单独的线程,则允许父线程关闭自己的连接并且一切正常。 (请注意,您仍然需要以某种方式知道 child 已经完成,才能执行此操作)相反,如果我直接调用 recv,它显然会阻塞,但我怀疑它会在子进程关闭连接后立即引发 EOFError。但事实并非如此。谁能解释一下?
最佳答案
在 self.child.start()
之后添加 child_conn.close()
。是idiomatic for working with pipes to close unused ends .还(可选)提供 duplex=False
参数。
The things is, I don't know beforehand whether it is going to close right away.. Normally the child should be able to send and receive. Furthermore I still do not get why this won't work, as is.
child_conn.close()
在 parent 中并不意味着 child 应该立即关闭它的结尾parent_conn.recv
只要有人有机会 child_conn.send()
就不会返回。如果 child_conn
被打开(在 child 或 parent 中)那么是一个机会If I do use the separate thread, the parent is allowed to close its own connection and everything works fine. Note that you still need to know somehow that the child is done for, to do this
你不需要知道它。您可以在 child 打开连接后立即关闭。在 self.child.start()
之后在父级中调用 child_conn.close()
是可以的,无论子级做什么。
Could you explain the duplex option a little bit more also?
duplex=False表示管道是单向的,即您只能调用 parent_conn.recv()
和 child_conn.send()
。否则它是双向的,并且两个连接都支持发送/接收。
关于python - 即使子进程不存在,MultiProcessing Pipe recv 也会阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20608495/
我正在尝试使用多处理和队列实现生产者-消费者场景;主进程是生产者,两个子进程使用队列中的数据。这在没有任何异常 发生的情况下有效,但问题是我希望能够在工作人员死亡时重新启动他们(kill -9 wor
我试图在一个管理进程下启动一个数据队列服务器(这样它以后可以变成一个服务),虽然数据队列服务器功能在主进程中工作正常,但它在一个进程中不起作用使用 multiprocessing.Process 创建
我的多处理需求非常简单:我从事机器学习工作,有时我需要评估多个数据集中的一个算法,或者一个数据集中的多个算法,等等。我只需要运行一个带有一些参数的函数并获取一个数字。 我不需要 RPC、共享数据,什么
创建进程池或简单地遍历一个进程以创建更多进程之间有任何区别(以任何方式)吗? 这有什么区别?: pool = multiprocessing.Pool(5) pool.apply_async(work
multiprocessing.BoundedSemaphore(3) 与 multiprocessing.Sempahore(3) 有何不同? 我希望 multiprocessing.Bounded
我尝试通过 multiprocessing 包中的 Queue 对 Pipe 的速度进行基准测试。我认为 Pipe 会更快,因为 Queue 在内部使用 Pipe。 奇怪的是,Pipe 在发送大型 n
我有这样一个简单的任务: def worker(queue): while True: try: _ = queue.get_nowait()
我正在尝试编写一个与 multiprocessing.Pool 同时应用函数的应用程序。我希望这个函数成为一个实例方法(所以我可以在不同的子类中以不同的方式定义它)。这似乎是不可能的;正如我在其他地方
在 python 2 中,multiprocessing.dummy.Pool 和 multiprocessing.pool.ThreadPool 之间有什么区别吗?源代码似乎暗示它们是相同的。 最佳
我正在开发一个用于财务目的的模型。我将整个 S&P500 组件放在一个文件夹中,存储了尽可能多的 .hdf 文件。每个 .hdf 文件都有自己的多索引(年-周-分)。 顺序代码示例(非并行化): im
到目前为止,我是这样做的: rets=set(pool.map_async(my_callback, args.hosts).get(60*4)) 如果超时,我会得到一个异常: File "/usr
参见下面的示例和执行结果: #!/usr/bin/env python3.4 from multiprocessing import Pool import time import os def in
我的任务是监听 UDP 数据报,对其进行解码(数据报具有二进制信息),将解码后的信息放入字典中,将字典转储为 json 字符串,然后将 json 字符串发送到远程服务器(ActiveMQ)。 解码和发
我在 macOS 上工作,最近被 Python 3.8 多处理中“fork”到“spawn”的变化所困扰(参见 doc )。下面显示了一个简化的工作示例,其中使用“fork”成功但使用“spawn”失
multiprocessing.Queue 的文档指出从项目入队到其腌制表示刷新到底层管道之间存在一点延迟。显然,您可以将一个项目直接放入管道中(它没有说明其他情况,并且暗示情况就是如此)。 为什么管
我运行了一些测试代码来检查在 Linux 中使用 Pool 和 Process 的性能。我正在使用 Python 2.7。 multiprocessing.Pool 的源代码似乎显示它正在使用 mul
我在 Windows Standard Embedded 7 上运行 python 3.4.3。我有一个继承 multiprocessing.Process 的类。 在类的 run 方法中,我为进程对
我知道multiprocessing.Process类似于 threading.Thread当我子类 multiprocessing.Process 时要创建一个进程,我发现我不必调用 __init_
我有教科书声明说在多处理器系统中不建议禁用中断,并且会花费太多时间。但我不明白这一点,谁能告诉我多处理器系统禁用中断的过程?谢谢 最佳答案 在 x86(和其他架构,AFAIK)上,启用/禁用中断是基于
我正在执行下面的代码并且它工作正常,但它不会产生不同的进程,而是有时所有都在同一个进程中运行,有时 2 个在一个进程中运行。我正在使用 4 cpu 机器。这段代码有什么问题? def f(values
我是一名优秀的程序员,十分优秀!