Python - 在 Windows 中的多进程下创建线程时出现“can't pickle thread.lock”错误

2024-04-27

我陷入了我认为的基本多进程和线程问题。我已经设置了一个多进程,其中有一个线程。但是,当我在其中设置线程类时init函数,我收到以下错误:

“类型错误:无法pickle thread.lock对象”。

但是,如果线程是在线程之外设置的,则不会发生这种情况init功能。有谁知道为什么会发生这种情况?请注意,我使用的是 Windows。

下面的一些代码可以说明这个问题。如下所示,它运行良好。但是,如果从 DoStuff 内部调用 print_hello()initdef,那么就会出现错误,如果是在多进程的run() def中调用那就没问题了。

任何人都可以为我指出正确的方向,以便在调用时运行良好init?谢谢!

import multiprocessing
import threading
import time

class MyProcess(multiprocessing.Process):

    def __init__(self, **kwargs):
        super(MyProcess, self).__init__(**kwargs)
        self.dostuff = DoStuff()

    def run(self):
        print("starting DoStuff")
        # This works fine if the line below is uncommented and __init__ self.print_hello() is commented...
        self.dostuff.print_hello()


class DoStuff(object):
    def __init__(self, **kwargs):
        super(DoStuff, self).__init__(**kwargs)

        # If the following is uncommented, the error occurs...
        #   Note it also occurs if the lines in start_thead are pasted here...
        # self.print_hello()

    def print_hello(self):
        print "hello"
        self.start_thread()

    def start_thread(self):
        self.my_thread_instance = MyThread()
        self.my_thread_instance.start()
        time.sleep(0.1)


class MyThread(threading.Thread):
    def __init__(self):
        super(MyThread, self).__init__()

    def run(self):
        print("Starting MyThread")


if __name__ == '__main__':
    mp_target = MyProcess()       # Also pass the pipe to transfer data
    # mp_target.daemon = True
    mp_target.start()
    time.sleep(0.1)

看起来没有简单的答案,而且似乎是 Windows 的限制(在我的例子中是 Win 7、python 3.6);在 Windows 上,您似乎需要先启动该进程,然后才能在拥有的对象内启动工作线程。

Unix 上似乎没有这样的限制(CentOS 7、python 2.7.5)。

作为实验,我修改了您的代码如下;此版本检查操作系统并首先启动进程或首先启动线程:

import multiprocessing
import threading
import time
import os

class MyProcess(multiprocessing.Process):

    def __init__(self, **kwargs):
        super(MyProcess, self).__init__(**kwargs)
        self.dostuff = DoStuff(self)

    def run(self):
        print("MyProcess.run()")
        print("MyProcess.ident = " + repr(self.ident))
        if os.name == 'nt':
            self.dostuff.start_thread()

class DoStuff(object):
    def __init__(self, owner, **kwargs):
        super(DoStuff, self).__init__(**kwargs)
        self.owner = owner
        if os.name != 'nt':
            self.start_thread()

    def start_thread(self):
        print("DoStuff.start_thread()")
        self.my_thread_instance = MyThread(self)
        self.my_thread_instance.start()
        time.sleep(0.1)

class MyThread(threading.Thread):
    def __init__(self, owner):
        super(MyThread, self).__init__()
        self.owner = owner

    def run(self):
        print("MyThread.run()")
        print("MyThread.ident = " + repr(self.ident))
        print("MyThread.owner.owner.ident = " + repr(self.owner.owner.ident))

if __name__ == '__main__':
    mp_target = MyProcess()       # Also pass the pipe to transfer data
    mp_target.daemon = True
    mp_target.start()
    time.sleep(0.1)

...并在 Windows 上得到以下结果,其中进程首先启动:

MyProcess.run()
MyProcess.ident = 14700
DoStuff.start_thread()
MyThread.run() 
MyThread.ident = 14220
MyThread.owner.owner.ident = 14700

...以及 Linux 上的以下内容,首先启动线程:

DoStuff.start_thread()
MyThread.run()
MyThread.ident = 140316342347520
MyThread.owner.owner.ident = None
MyProcess.run()
MyProcess.ident = 4358

如果这是我的代码,我会倾向于先启动进程,然后在该进程中创建线程;以下版本在两个平台上都适合我:

import multiprocessing
import threading
import time

class MyProcess(multiprocessing.Process):

    def __init__(self, **kwargs):
        super(MyProcess, self).__init__(**kwargs)
        self.dostuff = DoStuff()

    def run(self):
        print("MyProcess.run()")
        self.dostuff.start_thread()

class DoStuff(object):
    def __init__(self, **kwargs):
        super(DoStuff, self).__init__(**kwargs)

    def start_thread(self):
        self.my_thread_instance = MyThread()
        self.my_thread_instance.start()
        time.sleep(0.1)

class MyThread(threading.Thread):
    def __init__(self):
        super(MyThread, self).__init__()

    def run(self):
        print("MyThread.run()")

if __name__ == '__main__':
    mp_target = MyProcess()       # Also pass the pipe to transfer data
    mp_target.daemon = True
    mp_target.start()
    time.sleep(0.1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python - 在 Windows 中的多进程下创建线程时出现“can't pickle thread.lock”错误 的相关文章

  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • python中热图的层次聚类

    我有一个 NxM 矩阵 其值范围为 0 到 20 我可以使用 Matplotlib 和 pcolor 轻松获得热图 现在我想使用 scipy 应用层次聚类和树状图 我想重新排序每个维度 行和列 以显示哪些元素相似 根据聚类结果 如果矩阵是方
  • 带有指针数组的 cython

    我在 python 中有一个 numpy ndarrays 列表 具有不同的长度 并且需要非常快速地访问 python 中的列表 我认为指针数组就可以解决问题 我试过 float type t list of arrays no of ar
  • 带括号的上下文管理器

    我试图了解新的新内容带括号的上下文管理器Python 3 10 中的功能 新功能中的顶部项目here https docs python org 3 10 whatsnew 3 10 html 我的测试示例是尝试编写 with open f
  • Pip install 导致此错误“ cl.exe' failed with exit code 2 ”

    我已经阅读了有关此错误的所有其他问题 但令人沮丧的是 没有一个给出有效的解决方案 如果我跑pip install sentencepiece在命令行中 它给出了以下输出 src sentencepiece sentencepiece wra
  • 引发 RuntimeError(f"目录 '{directory}' 不存在") RuntimeError: 导入 fitz 时目录 'static/' 不存在

    当我运行 extract img py 文件时出现此错误 RuntimeError f 目录 directory 不存在 运行时错误 导入 fitz 时不存在目录 static 我不明白为什么这会给我发回此错误消息 我之前看到过关于这个话题
  • 通过鼻子测试检查某个函数是否发出警告

    我正在使用编写单元测试nose http somethingaboutorange com mrl projects nose 0 11 2 我想检查函数是否引发警告 该函数使用warnings warn 这是很容易就能做到的事情吗 def
  • Python 使用 M2Crypto 通过 S/MIME 对消息进行签名

    我现在花了几个小时 但找不到我的错误 我想要一个简单的例程来创建 S MIME 签名消息 稍后可以与 smtplib 一起使用 这是我到目前为止所拥有的 usr bin python2 7 coding utf 8 from future
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 理解@property装饰器和继承[重复]

    这个问题在这里已经有答案了 这里是 Python 3 以防万一它很重要 我试图正确理解如何实现继承 property使用 我已经搜索了 StackOverflow 并阅读了大约 20 个类似的问题 但无济于事 因为他们试图解决的问题略有不同
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • Selenium:等到 WebElement 中的文本发生变化

    我在用着selenium使用Python 2 7 从网页上的搜索框检索内容 搜索框动态检索结果并在框本身中显示结果 from selenium import webdriver from selenium webdriver common
  • 如何使用 jira-python 设置 fixVersions 字段

    我正在尝试使用 jira python 模块 http jira python readthedocs org en latest 更新现有的 JIRA 具体来说 我正在尝试设置问题的fixesVersion 列表 我已经尝试了一段时间但没
  • 提交表格并上传带有请求的文件

    我正在努力提交特定的表格蟒蛇请求 http www python requests org 我想使用它的网站上的其他表单工作正常 我可以提交登录表单等 这只是我遇到问题的文件上传 显然 提交表单效果很好 因为我从网站收到一条消息 说 请返回
  • Floyd-Warshall 算法:获取最短路径

    假设一个图由一个表示n x n维数邻接矩阵 我知道如何获得所有对的最短路径矩阵 但我想知道有没有办法追踪所有最短路径 Blow是python代码实现 v len graph for k in range 0 v for i in range
  • 如何在matplotlib中基于x轴更改直方图颜色

    我有根据 pandas 数据框计算出的直方图 我想根据 x 轴值更改颜色 例如 If the value is 0 the color should be green If the value is gt 0 the color shoul
  • Python 垃圾收集有时在 Jupyter Notebook 中不起作用

    我的一些 Jupyter 笔记本经常出现 RAM 不足的情况 而且我似乎无法释放不再需要的内存 这是一个例子 import gc thing Thing result thing do something thing None gc col
  • 向量化 numpy bincount

    我有一个 2d numpy 数组 A我要申请np bincount 到矩阵的每一列A生成另一个二维数组B由原始矩阵每列的 bincounts 组成A 我的问题是 np bincount 是一个采用一维数组的函数 它不是像这样的数组方法B A
  • Jupyter Notebook 中的多处理与线程

    我试图测试这个例子here https ipywidgets readthedocs io en stable examples Widget 20Asynchronous html将其从线程更改为多处理 在 jupyter Noteboo
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp

随机推荐

  • 使用 r 写入和更新 DB2 表

    我不知道如何更新 R 中现有的 DB2 数据库或更新其中的单个值 除了非常一般的信息之外 我在网上找不到关于这个主题的太多信息 但没有具体的例子 library RJDBC teachersalaries data frame name c
  • Java OutputStream 读取字符串行

    我使用一个 API 更多信息 见下文 它接受输出流捕获数据 相反 我想提供一个Consumer of Strings它消耗了一行又一行的数据 因此我必须编写一个 OutputStream 实现来包装这样的 Consumer 这是我能想到的最
  • 无法让 D3 .on('mouseover', ...) 工作

    我正在学习 D3 并尝试通过将鼠标悬停在 SVG 圆圈上来在散点图上显示数据信息 我从 csv 文件中获取数据 数据位于太阳系 包含行星名称 质量和半径 并且所有圆圈都正确显示 但是当我尝试在鼠标悬停时 console log 数据信息 例
  • 如何使用 grep 查找文件夹内的单词?

    在 Windows 中 我会进行搜索以在文件夹中查找单词 同样 我想知道某个特定单词是否出现在包含许多子目录和文件的目录中 我对 grep 语法的搜索显示我必须指定文件名 即grep string filename Now I do not
  • 使用 Javascript DOM 获取带有标签名称的第一个元素

    我正在尝试获取带有标签的第一个元素
  • 渐进增强 - Node.js、Backbone.js

    Node js 服务器有两个角色 前缀为 api 的路由上的 RESTFul API 在其他路线上呈现网站页面 plans features terms 目前 我的所有页面都会呈现一个 正在加载页面 并与 Backbone router 启
  • 如何增加/检查 Linux 上 Docker 的默认内存?

    我发现在 Windows 和 Mac 上 更改给定的 RAM 容器非常容易 您只需进入 GUI 即可 但是如何在 Linux 上执行此操作 使用 CLI 而不是 GUI 呢 Docker 文档提到了 m标志 但这个标志没有给出任何响应 只是
  • 我可以自定义 UILocalNotification 重复间隔(即仅限工作日吗?)

    我希望能够安排 UILocalNotification 在每天的同一时间重复 但仅限于工作日 没有周六或周日 使用 UILocalNotification 的重复间隔功能是否可以实现这一点 或者是我创建某种处理时间和日期并计算出何时提前安排
  • 如何快速识别 SQL Server 中最近修改的存储过程

    我需要手动将修改后的存储过程从 DEV SQL Server 2005 数据库实例迁移到 TEST 实例 除了我要迁移的更改之外 数据库具有相同的架构 如何快速识别DEV数据库中哪些存储过程被修改并迁移到TEST实例 我假设我可以针对某些系
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • 掌握 CodeIgniter - 模板化/加载视图

    尝试学习 CI 并浏览文档以获得更好的理解 如果没有单独的库 我可以通过包含视图列表来制作模板 如下所示 this gt load gt view header this gt load gt view navigation this gt
  • Doctrine2 多对一双向关系不起作用

    我正在尝试在两个实体之间进行双向关联 问题是 从 Book 我可以得到它们的所有者 但从 Owner 我无法得到拥有的书籍 这是代码的重要部分 Acme BookBundle Entity Book ORM ManyToOne target
  • TensorFlow - 根据另一个变量的形状动态定义变量的形状

    假设我有一定的张量x其维度未在图初始化时定义 我可以使用以下方法获得它的形状 x shape tf shape input x 现在 如果我想根据中定义的值创建一个变量x shape using y tf get variable vari
  • C 结构体的 Python ctypes 定义

    我正在尝试调用 Matlab 编码器生成的一些 C 代码 Matlab 使用名为 emxArray 的 C 结构体来表示矩阵 记录如下 http www mathworks co uk help fixedpoint ug c code i
  • 如何使用 codeigniter 生成 5 位字母数字唯一 ID?

    我有一个项目 需要为用户生成唯一的 5 位数字母数字 ID 我怎样才能使用 codeigniter 实现这一点 thanks 字符串助手中有一个名为 random string 的函数 this gt load gt helper stri
  • urllib2.urlopen 在 Django 中失败

    I use urllib2 urlopen url 获取 HTML 内容 网址是http 127 0 0 1 8000 m html 该方法成功获取HTML内容 但在 Django 中 如果我尝试获取 HTML 内容 它会在函数中停止 ur
  • 检查 python 中的 type == list 是否[重复]

    这个问题在这里已经有答案了 我无法弄清楚我的代码有什么问题 for key in tmpDict print type tmpDict key time sleep 1 if type tmpDict key list print this
  • 为什么链接器要修改--defsym“绝对地址”

    目标 一个使用可执行文件中的函数 不导出符号 的共享库 Means gcc Wl defsym function 0x432238 手册页指出 defsym symbol expression Create a global symbol
  • 无法在 root 设备上运行程序“su”

    我有一部运行 Android N AOSP 版本 的 root 手机 我试图从我的应用程序获取 root 权限 但它不断被拒绝 这是我正在尝试的 java lang Process p runtime exec su DataOutputS
  • Python - 在 Windows 中的多进程下创建线程时出现“can't pickle thread.lock”错误

    我陷入了我认为的基本多进程和线程问题 我已经设置了一个多进程 其中有一个线程 但是 当我在其中设置线程类时init函数 我收到以下错误 类型错误 无法pickle thread lock对象 但是 如果线程是在线程之外设置的 则不会发生这种