有没有办法在不使用 python GIL 的情况下 serialize/deserialize

Is there a way to serialize/deserialize without engaging the python GIL

快速测试表明 cPickle (python 3.6.9 import pickle ) 参与了 GIL。

import pickle
import os

big_data = os.urandom(10000000)

def run():
    pickle.loads(pickle.dumps(big_data))

t = timeit.Timer(run)
[threading.Thread(target=lambda: t.timeit(number=2000)).start() for _ in range(4)]

4 个线程的测试 运行 序列化操作以 100% cpu 运行,例如它参与了 GIL。相同类型的测试运行一个numpy操作使用400%cpu(没有GIL参与numpy)。

我希望作为 C 函数的 cPickle 不会使用 GIL。有没有办法解决?我希望能够在不阻塞主进程的情况下反序列化大量数据。

我正在尝试每秒从工作进程中提取超过 3GB 的数据返回到主进程。我可以使用流式套接字和 asyncio 以 4GB/秒的速度移动数据,但反序列化是一个瓶颈。 I don't have the luxury of Python 3.8 和 SharedMemory 还很不幸。

当然,可以接受的答案是肯定的。

根据@juanpa.arrivillaga的评论回答来结束这个问题:

我不明白为什么模块是 C 扩展这一事实会让您认为它不会使用 GIL。根据我的理解,GIL 解决的根本问题是线程安全地访问 Python 解释器级对象,这些对象依赖于垃圾收集的引用计数。由于 pickle serialization/deserialization 涉及其他线程可能访问的 Python 对象,因此它必须使用 GIL。