我一整天都被这个问题困扰,并且无法找到与我想要完成的任务相关的任何解决方案。
我试图将队列传递给子进程中生成的线程。队列在入口文件中创建并作为参数传递给每个子流程。
我正在制作一个模块化程序来a)运行神经网络b)在需要时自动更新网络模型c)将事件/图像从神经网络记录到服务器。我以前的程序只崇拜一个运行多个线程的 CPU 核心,并且速度变得相当慢,因此我决定需要对程序的某些部分进行子处理,以便它们可以在自己的内存空间中运行,以充分发挥其潜力。
子流程:
总共 4 个子流程。
在开发过程中,我需要在每个进程之间进行通信,以便它们都位于同一页面上,并包含来自服务器的事件等。所以据我所知,队列将是最好的选择。
(澄清:来自“多处理”模块的“队列”,而不是“队列”模块)
~~不过~~
每个子进程都会产生自己的线程。例如,第一个子进程将产生多个线程:每个队列一个线程,用于侦听来自不同服务器的事件并将它们传递到程序的不同区域;一个线程监听从神经网络之一接收图像的队列;一个线程监听从网络摄像头接收实时图像的队列;一个线程监听从另一个神经网络接收输出的队列。
我可以毫无问题地将队列传递给子流程,并且可以有效地使用它们。但是,当我尝试将它们传递给每个子进程中的线程时,我收到上述错误。
我对多重处理相当陌生;然而,除了共享内存空间和 GIL 之外,其背后的方法看起来与线程相对相同。
这是来自 Main.py;程序入口。
from lib.client import Client, Image
from multiprocessing import Queue, Process
class Main():
def __init__(self, server):
self.KILLQ = Queue()
self.CAMERAQ = Queue()
self.CLIENT = Client((server, 2005), self.KILLQ, self.CAMERAQ)
self.CLIENT_PROCESS = Process(target=self.CLIENT.do, daemon=True)
self.CLIENT_PROCESS.start()
if __name__ == '__main__':
m = Main('127.0.0.1')
while True:
m.KILLQ.put("Hello world")
Run Code Online (Sandbox Code Playgroud)
这是来自 client.py (在名为 lib 的文件夹中)
class Client():
def __init__(self, connection, killq, cameraq):
self.TCP_IP …Run Code Online (Sandbox Code Playgroud)