【问题标题】:Using Async/Await with Pickle将 Async/Await 与 Pickle 一起使用
【发布时间】:2017-11-05 14:56:43
【问题描述】:

我是async/await 的新手,遇到了一些困惑。 pickle 应该以某种方式成为 awaited 吗?

例如,假设我有以下async 类方法:

async def get(self, key):
    redis = await self.getRedis()
    data = await redis.get(key)
    if not data:
        return None

    return pickle.loads(data)

async def set(self, key, value, ttlInSeconds):
    pickled = pickle.dumps(value)

    redis = await self.getRedis()
    await redis.setex(key, pickled, ttlInSeconds)

如果我正在序列化或反序列化一个大对象,pickle 上的整个循环不会阻塞吗?出于实际目的,对于较小的对象,这种瞬时阻塞是否可以接受?谢谢!

【问题讨论】:

    标签: python python-3.x asynchronous async-await python-3.5


    【解决方案1】:

    应该阻止酸洗,因为如果你的类中的另一个方法可以在set()仍在处理pickle.dumps()时执行和修改value,那么酸洗的数据将被破坏。

    即使该对象一次肯定只有一个实例,这也适用。

    顺便说一句,get(),您可以将await 替换为return pickle.loads(data),因为您不太可能修改尚未从该方法返回的数据。

    【讨论】:

    • 我明白了,谢谢!我想我把关于异步的“全有或全无”的建议看得太认真了。我的印象是你需要run_in_executor()所有阻塞代码。
    猜你喜欢
    • 2019-04-15
    • 2014-06-19
    • 2018-01-14
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多