gpt4 book ai didi

python - 有没有一种方法可以在不使用 python GIL 的情况下进行序列化/反序列化

转载 作者:行者123 更新时间:2023-12-03 10:08:27 25 4
gpt4 key购买 nike

快速测试表明 cPickle(python 3.6.9 import pickle defaults to using cPickle)使用了 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 序列化/反序列化涉及其他线程可能访问的 Python 对象,因此它必须使用 GIL。

关于python - 有没有一种方法可以在不使用 python GIL 的情况下进行序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58845490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com