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

大卫·帕克斯

快速测试显示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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种方法可以默认使用Spring Integration进行JSON序列化?

有没有一种方法可以使serde_json严格反序列化?

有没有一种方法可以在AspNetUser表中反序列化ProtectedTicket?

在使用Jackson进行类序列化时添加类型信息,以便可以在不使用注释的情况下使用接口类型反序列化?

为什么在序列化/反序列化的情况下仅创建一个父对象

在不使用唯一属性名称的情况下反序列化JSON

有没有一种方法可以使用HashWithIndifferentAccess序列化ActiveRecord的JSON属性?

有没有一种方法/库可以对Dynamodb转储文件数据进行反序列化?

谷物:在没有默认构造函数的情况下反序列化对象向量

如何在没有给定长度的情况下反序列化Bincode字段

使用JsonTypeInfo进行序列化/反序列化

JSON.net在不使用模式的情况下反序列化JSON

有没有一种方法可以使用Serde反序列化任意JSON,而无需创建细粒度的对象?

有没有一种方法可以使序列号字符串不使用for循环?

有没有一种方法可以在不使用std :: move的情况下使用构造的类来初始化类?

在protobuf-net中,有没有一种方法可以指定在序列化/反序列化给定类型时要使用的自定义方法?

ObjectStream:有没有一种方法可以读取序列化对象作为属性映射?

有没有一种方法可以在Django中序列化多个对象?

有没有一种方法可以使Rust中的(反)序列化枚举“变平”?

有没有一种方法可以在序列化时自动初始化空子对象?

在春季,默认情况下是否可以对类型使用自定义序列化器/反序列化器?

有没有一种方法可以指定类型,除非使用自定义转换器,否则必须进行反序列化才能成功?

如何使用ObjectMapper在没有默认构造函数的情况下反序列化不可变对象?

如何使用 JSON-B 在没有 setter 的情况下解组/反序列化集合

如何在不反序列化第一个protobuf的情况下将序列化protobuf与另一个protobuf合并

有没有一种方法可以在不使用各种不同方法的情况下对字符串进行突变?

有没有一种方法可以在不使用MatTableDataSource的情况下对物料表进行物料分页?角度10

在没有任何格式操作的情况下反序列化日期时间字符串

如何在没有System.Configuration的情况下以编程方式反序列化xml文件