python - pickle.dump 由于 GIL 而阻塞多线程 python 应用程序中的主线程

标签 python multithreading cython pickle gil

目前我正在使用 python 3.4.3 并开发 PyQt5 应用程序。

在我的应用程序中,有一个 QThread,并且该线程正在(pickle)转储一些大对象(100MB)。

但是,转储该对象需要 1~2 秒,并且由于 GIL 的原因,它会阻塞主线程大约 1~2 秒。

如何解决这个问题(不阻塞主线程)?

我认为将对象序列化为字符串需要时间,并且需要 GIL,最终会阻塞主线程。(据我所知,写入文件不需要 GIL)

我正在考虑使用 Cython,但由于我是 cython 的初学者,我不确定使用 Cython 是否可以解决这个问题。

有什么办法可以解决这个问题吗?

编辑:我尝试了multiprocessing模块,但是交互时间(跨进程传递共享内存变量)也需要大约1~2秒,最终没有任何优势。

最佳答案

我解决了我的问题。

解决方案是

  1. 让我的对象变得非常简单。就我而言,我将对象转换为简单字符串化字典的数组。

  2. 我直接使用了file.write(stringified_dictionaries)而不是使用pickle。这减少了将 python 对象序列化为字符串的时间。

由于Python中的磁盘I/O不需要GIL,所以主线程唯一被阻塞的时刻是转换我的对象的时刻,这非常短。

关于python - pickle.dump 由于 GIL 而阻塞多线程 python 应用程序中的主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38680485/

相关文章:

python - Cython 内存 View 错误 : Invalid index for memoryview specified

python-3.x - 在 `setup.py` 或 `pyproject.toml` 中指定 Python PIP 参数

python - 理解Python的枚举

python - Pandas :将不同天数添加到数据框中的日期

python - 如何在 TensorFlow 中选择交叉熵损失?

multithreading - Web 浏览器是否对打开的选项卡使用不同的端口号?

python - 以指定的最大运行时间运行外部程序

python - 按日期范围查询对象 - 错误 - {TypeError}预期字符串或类似字节的对象

multithreading - "C# 3.0 in a Nutshell"中关于线程的文本说明

python - 使用 python-c-api 调用的 Cython 回调段错误