4 votes

Comment rendre non bloquante une fonction qui inclut une boucle for ?

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 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X