将 Async/Await 与 Pickle 一起使用
Posted
技术标签:
【中文标题】将 Async/Await 与 Pickle 一起使用【英文标题】:Using Async/Await with Pickle 【发布时间】:2017-11-05 14:56:43 【问题描述】:我是async
/await
的新手,遇到了一些困惑。 pickle
应该以某种方式成为 await
ed 吗?
例如,假设我有以下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() 一起使用
将 fetch 与 async/await 一起使用会返回 [object Object]
将 Async/Await 与 node-postgres 一起使用