目前我正在使用 python 3.4.3 并开发 PyQt5 应用程序。
在我的应用程序中,有一个 QThread,并且该线程正在(pickle)转储一些大对象(100MB)。
但是,转储该对象需要 1~2 秒,并且由于 GIL 的原因,它会阻塞主线程大约 1~2 秒。
如何解决这个问题(不阻塞主线程)?
我认为将对象序列化为字符串需要时间,并且需要 GIL,最终会阻塞主线程。(据我所知,写入文件不需要 GIL)
我正在考虑使用 Cython,但由于我是 cython 的初学者,我不确定使用 Cython 是否可以解决这个问题。
有什么办法可以解决这个问题吗?
编辑:我尝试了multiprocessing
模块,但是交互时间(跨进程传递共享内存变量)也需要大约1~2秒,最终没有任何优势。
最佳答案
我解决了我的问题。
解决方案是
让我的对象变得非常简单。就我而言,我将对象转换为简单字符串化字典的数组。
我直接使用了
file.write(stringified_dictionaries)
而不是使用pickle。这减少了将 python 对象序列化为字符串的时间。
由于Python中的磁盘I/O不需要GIL,所以主线程唯一被阻塞的时刻是转换我的对象的时刻,这非常短。
关于python - pickle.dump 由于 GIL 而阻塞多线程 python 应用程序中的主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38680485/