无法在 Windows 的多处理环境中“pickle”Tkinter 对象

2024-04-29

我正在尝试创建一个应用程序,其中 Tkinter GUI 由不断获取数据的其他对象更新。我在使用多线程时遇到问题,因此我决定尝试使用多处理模块。

我发现您无法在其中运行 Tkinter 窗口multiprocessing.Process,这是最小的示例:

import Tkinter as tk
import multiprocessing

class Subprocess(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.root = tk.Tk()
    #

    def run(self):
        self.root.mainloop()
    #

    def stop(self):
        self.root.destroy()
        self.terminate()


if __name__ == '__main__':
        process = Subprocess()
        process.start()
        print "I got around the global interpreter lock"
        raw_input()
        print "exiting"
        process.stop()

我期望发生的是弹出一个 Tk 窗口,并在终端中显示“我绕过了全局解释器锁”。我在 ubuntu linux 上测试了这个,它工作得很好,但是当我切换到 Windows 7(我正在开发我的应用程序)时,它失败了,给了我错误:

Traceback (most recent call last):
  File "C:\pathtoscript\multiprocessing_test.py", line 21, in <module>
    process.start()
  File "C:\Python27\lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "C:\Python27\lib\multiprocessing\forking.py", line 277, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python27\lib\multiprocessing\forking.py", line 199, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python27\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 419, in save_reduce
    save(state)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 725, in save_inst
    save(stuff)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python27\lib\pickle.py", line 313, in save
    (t.__name__, obj))
PicklingError: Can't pickle 'tkapp' object: <tkapp object at 0x02BD3D08>

有谁知道这个问题的解决方法?我觉得奇怪的是,这在 Linux 上有效,但在 Windows 上无效。


这是一个简单的修复 - 只需创建tkapp子进程中的对象,而不是父进程中的对象:

import Tkinter as tk
import multiprocessing
from Queue import Empty

class Subprocess(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.queue = multiprocessing.Queue()
    #

    def run(self):
        self.root = tk.Tk()
        self.root.after(100, self._check_queue) # Check the queue every 100ms
        self.root.mainloop()

    def _check_queue(self):
        try:
            out = self.queue.get_nowait()
            if out == 'stop':
                self.do_stop()
                return
            # Could check for other commands here, too
        except Empty:
            pass
        self.root.after(100, self._check_queue)

    def stop(self):
        self.queue.put('stop')

    def do_stop(self):
        self.root.destroy()


if __name__ == '__main__':
    process = Subprocess()
    process.start()
    print "I got around the global interpreter lock"
    raw_input()
    print "exiting"
    process.stop()

试图创建tkapp在父母身上,然后在孩子身上开始,这不是一个可行的解决方案。唯一棘手的部分是你需要使用Queue告诉父进程停止子进程中的循环。

另外,就其价值而言,在 Linux 上运行原始代码实际上会让我的解释器崩溃:

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
      after 87 requests (87 known processed) with 0 events remaining.
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Windows 的多处理环境中“pickle”Tkinter 对象 的相关文章

  • 出现异常时进行截图

    嘿 有没有一种方法可以在异常 任何异常 时捕获屏幕截图 我的 失败 解决方案位于BaseTestCase unittest TestCase子类 class BaseTestCase unittest TestCase classmetho
  • 如何选择单选按钮?

    我在用mechanize我正在尝试从单选按钮列表中选择一个按钮 该列表有 5 项 如何选择第一项 文档没有帮助我 gt gt gt br form
  • Matplotlib imshow:如何在矩阵上应用蒙版

    我正在尝试以图形方式分析二维数据 matplotlib imshow在这方面非常有用 但我觉得如果我可以从矩阵中排除一些单元格 超出感兴趣范围的值 我可以更多地利用它 我的问题是这些值使我感兴趣的范围内的色彩图 变平 排除这些值后 我可以获
  • OpenPyXL - 如何查询单元格边框?

    python 和 openpyxl 都是新的 编写一个 py 脚本来遍历大量 Excel 工作簿 工作表 并且需要找到由边框格式标识的某些单元格 我在网上看到几个关于如何设置单元格边框的示例 但我需要阅读它们 具体来说 当表内的数据不一致但
  • 如何分组显示argparse子命令?

    对于具有许多子命令的程序 我想在 help 输出中显示它们按逻辑分组 Python argparse 有一个add argument group http docs python org library argparse html argp
  • Django管理命令是在单独的进程中执行的吗?

    Django 有很多管理命令 此外 我们还可以编写自己的命令 进行 shell 调用后会发生什么python manage py XXX 代码是否会在从 shell 启动的进程中执行 或者 shell 进程只是与执行命令的主 Django
  • Python 中的自然日/相对日

    我想要一种在 Python 中显示日期项目的自然时间的方法 类似于 Twitter 将显示 刚才 几分钟前 两小时前 三天前 等消息 Django 1 0 在 django contrib 中有一个 人性化 方法 我没有使用 Django
  • Pandas系列矢量化文本处理

    我想使用矢量化操作改进我的 Pandas 代码 假设我有一个简单的 DataFrame 其中有一个文本列 其中可能包含 url Column1 0 hello http www google com 1 bye www mail com w
  • 字典键中的通配符

    假设我有一本字典 rank dict V 1 A 2 V 3 A 4 正如您所看到的 我在一个 V 的末尾添加了一个 虽然 3 可能只是 V 的值 但我想要 V1 V2 V2234432 等的另一个密钥 我想检查它 checker V30
  • 在 Win7 登录屏幕上运行应用程序[重复]

    这个问题在这里已经有答案了 我想通过服务在 Windows 7 的登录屏幕上运行应用程序 我对此进行了长期研究并尝试了不同的方法 但不幸的是到目前为止还没有完全成功 我设法在当前登录用户的锁定屏幕上运行该应用程序 起初我认为这就是我基本上试
  • 计算两个节点之间的最长路径 NetworkX

    我正在尝试使用 Networkx 制作甘特图 网络中的所有节点都是完成项目所需执行的 任务 使用 Networkx 可以轻松计算项目的总时间 但是制作甘特图我需要每个节点的最新启动 NetworkX 包含一个函数 dag longest p
  • 带剖面的 3D 曲面图

    基本上 我有一个由一组时间序列组成的曲面图 我想在特定高度添加剖面图 以更好地了解一年中值高于所选阈值的时期 由此 其中显示平面但不是剖面 To This 有什么建议吗 使用 alpha 和相机仰角并没有解决问题 平面似乎仍然在人物的前面
  • 使用 ruamel.yaml,如何使带有 NEWLINE 的变量成为不带引号的多行

    我正在生成用作协议的 YAML 其中包含一些生成的 JSON import json from ruamel import yaml jsonsample id 123 type customer account other myyamel
  • Pythonwinsound,ASYNC 标志不起作用?

    我正在使用 python 3 5 我试图在继续执行脚本的同时播放声音 根据https docs python org 3 5 library winsound html https docs python org 3 5 library w
  • 将多个 csv 文件连接成具有相同标头的单个 csv

    我目前正在使用以下代码导入 6 000 个 csv 文件 带标题 并将它们导出到单个 csv 文件 带单个标题行 import csv files from folder path r data US market merged data
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • 如何在 django-rest-framework 查询集响应中添加注释数据?

    我正在为查询集中的每个项目生成聚合 def get queryset self from django db models import Count queryset Book objects annotate Count authors
  • Python - 根据条件调用函数

    我想知道是否有一种简洁的方法来根据条件调用函数 我有这个 if list 1 some dataframe df myfunction 我想知道这是否有可能三元运算符 http book pythontips com en latest t
  • 在 pandas DataFrame 中使用比较列表的问题

    我在 pandas 中有一个 DataFrame 其列类型之一是 int 上的列表 如下所示 df pandas DataFrame 1 2 3 4 5 6 7 8 9 10 columns a b c d gt gt gt df a b
  • python nltk从句子中提取关键字

    我们要做的第一件事 就是杀掉所有律师 威廉 莎士比亚 鉴于上面的引用 我想退出 kill and lawyers 作为两个突出的关键词来描述句子的整体含义 我提取了以下名词 动词 POS 标签 First NNP thing NN do V

随机推荐