【发布时间】:2019-02-14 06:50:45
【问题描述】:
我正在尝试在执行 I/O 绑定任务的多个 threading.Thread(s) 和执行 CPU 绑定任务的多个 multiprocessing.Process(es) 之间进行通信。每当一个线程为一个进程找到工作时,它将被放在一个multiprocessing.Queue 上,以及一个multiprocessing.Pipe(duplex=False) 的发送端。然后,这些进程会尽其所能,并通过管道将结果发送回线程。这个过程似乎在大约 70% 的情况下有效,另外 30% 我收到了AttributeError: Can't get attribute 'DupFd' on <module 'multiprocessing.resource_sharer' from '/usr/lib/python3.5/multiprocessing/resource_sharer.py'>
复制:
import multiprocessing
import threading
import time
def thread_work(work_queue, pipe):
while True:
work_queue.put((threading.current_thread().name, pipe[1]))
received = pipe[0].recv()
print("{}: {}".format(threading.current_thread().name, threading.current_thread().name == received))
time.sleep(0.3)
def process_work(work_queue):
while True:
thread, pipe = work_queue.get()
pipe.send(thread)
work_queue = multiprocessing.Queue()
for i in range(0,3):
receive, send = multiprocessing.Pipe(duplex=False)
t = threading.Thread(target=thread_work, args=[work_queue, (receive, send)])
t.daemon = True
t.start()
for i in range(0,2):
p = multiprocessing.Process(target=process_work, args=[work_queue])
p.daemon = True
p.start()
time.sleep(5)
我查看了多处理source code,但不明白为什么会发生此错误。
我尝试使用queue.Queue,或带有duplex=True(默认)的管道,但在错误中找不到模式。有人知道如何调试吗?
【问题讨论】:
标签: python multithreading concurrency multiprocessing python-multiprocessing