Pour le code suivant à l'aide aiohttp:Quel est le problème avec ce code aiohttp asynchrone?
async def send(self, msg, url):
async with aiohttp.ClientSession() as session:
async with session.post(url, data=msg) as response:
self._msg = response.read()
async def recv(self):
return await self._msg
Il fonctionne ... La plupart du temps, mais parfois (souvent, en fait) donne lieu à diverses exceptions - réponses généralement tronquées, ou une connexion étant déjà fermée exception.
En revanche, ce qui suit fonctionne parfaitement:
async def send(self, msg, url):
async with aiohttp.ClientSession() as session:
async with session.post(url, data=msg) as response:
self._msg = await response.read()
async def recv(self):
return self._msg
Je voudrais savoir pourquoi, la deuxième version est techniquement incorrecte pour mes besoins et je dois corriger. (Il est incorrect car la fonction recv peut être appelée avant que la réponse ait été lue)
"Il est incorrect car la fonction recv peut être appelée avant que la réponse ait été lue" - si c'est ca lled avant que la réponse a été lue, alors qu'est-ce que ça va 'attendre' dans la première version? 'self._msg' n'a pas encore été défini. – user2357112
Exactement, le code que je viens de ne jamais appeler recv jusqu'à ce que l'envoi est terminé. Mais ah, c'est un très bon point, il s'avère que * les deux * versions sont fondamentalement fausses. Pouvez-vous suggérer une solution, tout en gardant le 'send' et le 'recv' séparés conceptuellement? – Arafangion
(Pour clarifier: Bien que j'apprécierais le correctif, la vraie réponse que je veux sortir de ceci est de comprendre la différence entre ces deux exemples de code) – Arafangion