小编Jul*_*eil的帖子

将队列传递给子进程中的线程时如何修复“TypeError:无法pickle _thread.lock对象”

我一整天都被这个问题困扰,并且无法找到与我想要完成的任务相关的任何解决方案。

我试图将队列传递给子进程中生成的线程。队列在入口文件中创建并作为参数传递给每个子流程。

我正在制作一个模块化程序来a)运行神经网络b)在需要时自动更新网络模型c)将事件/图像从神经网络记录到服务器。我以前的程序只崇拜一个运行多个线程的 CPU 核心,并且速度变得相当慢,因此我决定需要对程序的某些部分进行子处理,以便它们可以在自己的内存空间中运行,以充分发挥其潜力。

子流程:

  1. 客户端-服务器通信
  2. 网络摄像头控制和图像处理
  3. 神经网络的推理(有 2 个神经网络,每个神经网络都有自己的进程)

总共 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)

python queue multithreading multiprocessing

0
推荐指数
1
解决办法
1万
查看次数

标签 统计

multiprocessing ×1

multithreading ×1

python ×1

queue ×1