2017-06-04 4 views
0

Ich bin neu in async/await, und ich stieß auf ein bisschen Verwirrung. Sollte pickleawait irgendwie ed sein?Verwendung von Async/Warten mit Gurke

Zum Beispiel sagen, dass ich die folgenden async Klassenmethoden haben:

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) 

Wenn ich die Serialisierung oder ein großes Objekt deserialisieren, wird nicht die gesamte Loop-Block auf pickle? Für praktische Zwecke, mit kleineren Objekten, ist diese vorübergehende Blockierung akzeptabel? Vielen Dank!

Antwort

3

Sie sollte Block auf dem Beizen, weil, wenn eine andere Methode in Ihrer Klasse könnte dann ausführen und ändern value während set() noch pickle.dumps() Verarbeitung ist, werden die eingelegten Daten beschädigt.

Dies gilt auch dann, wenn dieses Objekt definitiv immer nur eine Instanz hat.

Btw in get(), könnten Sie await für return pickle.loads(data) setzen, da Sie wahrscheinlich nicht Daten zu ändern, die noch aus dieser Methode wird nicht zurückgegeben worden.

+0

Ich sehe, danke! Ich nehme an, dass ich den "alles oder nichts" Rat über async ein wenig zu ernst genommen habe. Ich hatte den Eindruck, dass Sie den gesamten Blockiercode "run_in_executor()" ausführen müssen. – Will