将 Async/Await 与 Pickle 一起使用

Posted

技术标签:

【中文标题】将 Async/Await 与 Pickle 一起使用【英文标题】:Using Async/Await with 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 上的整个循环不会阻塞吗?出于实际目的,对于较小的对象,这种瞬时阻塞是否可以接受?谢谢!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我明白了,谢谢!我想我把关于异步的“全有或全无”的建议看得太认真了。我的印象是你需要run_in_executor()所有阻塞代码。

以上是关于将 Async/Await 与 Pickle 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将 async/await 与 Dispatcher.BeginInvoke() 一起使用

将 Async/await 与 mongoose 一起使用

将 fetch 与 async/await 一起使用会返回 [object Object]

将 Async/Await 与 node-postgres 一起使用

将 async/await (Swift 5.5) 与 firebase 实时数据库一起使用

async/await 无法与 fs.writeFile 一起正常工作