J'essaie de rendre le code ci-dessous asynchrone :
import asyncio
import random
async def count():
l = []
for i in range(10000000):
l.append(i)
return random.choice(l)
async def long_task1():
print('Starting task 1...')
task_output = await count()
print('Task 1 output is {}'.format(task_output ))
async def long_task2():
print('Starting task 2...')
task_output = await count()
print('Task 2 output is {}'.format(task_output ))
async def main():
await asyncio.gather(long_task1(), long_task2())
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
Actuellement, il fonctionne de manière synchrone.
Est-ce parce que le count
la fonction fait défaut await
déclaration ?
J'ai essayé de retravailler la fonction pour inclure await
:
async def count():
l = []
for i in range(10000000):
l.append(i)
choice = await random.choice(l)
return choice
et elle démarrera de manière asynchrone (les deux Starting task 1...
et Starting task 2...
seront imprimées l'une après l'autre), mais ensuite j'obtiens une erreur :
TypeError : l'objet int ne peut pas être utilisé dans une expression 'await'.
Je comprends que l'erreur s'est produite parce que le résultat de random.choice(l)
n'est pas un awaitable (une coroutine), mais je ne sais pas comment corriger cela sans tourner en rond. Dois-je d'une manière ou d'une autre refactoriser la boucle for en une couroutine à part entière ?