快速测试显示cPickle(Python 3.6.9import pickle
默认使用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(numpy不使用GIL)。
我希望cPickle作为C函数,不会参与GIL。有没有办法解决?我希望能够反序列化大量数据而不会阻塞主进程。
我正在尝试每秒从辅助进程回到主站提取3GB的数据。我可以使用流套接字和异步以4GB /秒的速度移动数据,但是反序列化是一个瓶颈。不幸的是,我还没有使用Python 3.8和SharedMemory。
当然,可以接受的答案是信心十足。
从评论中获取@ juanpa.arrivillaga的答案以结束此问题:
我不明白为什么模块是C扩展这一事实应该使您认为它不会参与GIL。据我了解,GIL解决的根本问题是对依赖于引用计数进行垃圾收集的Python解释器级别对象的线程安全访问。由于pickle序列化/反序列化涉及其他线程可能访问的Python对象,因此必须使用GIL。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句