Come passare parametri a più attività asincrone in Python

Sep 02 2020

In questo momento ho un codice che assomiglia a questo:

    userinput1 = abc.....
    userinput2 = abc.....
    userinput3 = abc.....
    
    async def task1():
        do something with userinput1...
        do another thing...
    
    async def task2():
        do something with userinput2...
        do another thing...
    
    async def task3():
        do something with userinput3...
        do another thing...
    
    async def main():
        await asyncio.wait([task1() , task2(), task3()])
    
    if __name__ == '__main__':
        asyncio.get_event_loop().run_until_complete(main())

Come puoi vedere sopra, ho 3 funzioni asincrone che separano le cose contemporaneamente. Mi chiedevo se esiste un modo per creare facilmente molte funzioni basate sull'input dell'utente? In sostanza quello che voglio che sia in grado di fare è questo:

    userinput1 = abc.....
    userinput2 = abc.....
    userinput3 = abc.....
    userinput4 = abc.....
    amount_of_needed_functions = 4

E poi una volta ottenuti quei dati, verrebbe eseguito come questo script:

    async def task1():
            do something with userinput1...
            do another thing...
        
    async def task2():
            do something with userinput2...
            do another thing...
        
    async def task3():
            do something with userinput3...
            do another thing...
    
    async def task4():
            do something with userinput4...
            do another thing...
        
    async def main():
            await asyncio.wait([task1() , task2(), task3(), task4()])
        
    if __name__ == '__main__':
            asyncio.get_event_loop().run_until_complete(main())

Quindi, più o meno, creerebbe funzioni basate su determinati verificabili (come userinput1) e poi lo farebbe molte volte specificato (amount_of_needed_functions) e poi eseguirà tutti questi simultaneamente. Mi dispiace, questa è una domanda un po 'confusa, ma sono abbastanza perso su dove iniziare la ricerca. Grazie!

Risposte

1 AvivYaniv Sep 02 2020 at 04:06

Passa l'input dell'utente come argomento a ciascuna attività:

Singola funzione per più attività

import asyncio

async def function(user_input, input_index):
    print(f'In {input_index} function: {user_input}')


async def main():
    tasks = []
    for input_index in range(1, 4):
        user_input = input(f"Enter input #{input_index}\n")
        tasks.append(asyncio.create_task(function(user_input, input_index)))
    await asyncio.gather(*tasks)


if __name__ == '__main__':
    asyncio.run(main())

Molteplici funzioni per molteplici attività

Utilizza un dizionario per richiamare il metodo desiderato per ogni input.

import asyncio

async def function1(user_input, input_index):
    print(f'In {input_index} function1: {user_input}')

async def function2(user_input, input_index):
    print(f'In {input_index} function2: {user_input}')

async def function3(user_input, input_index):
    print(f'In {input_index} function3: {user_input}')


FUNCTION_DICTIONARY = { 1 : function1, 2 : function2, 3 : function3 }

async def main():
    tasks = []
    for input_index in range(1, 4):
        user_input = input(f"Enter input #{input_index}\n")
        tasks.append(asyncio.create_task(FUNCTION_DICTIONARY[input_index](user_input, input_index)))
    await asyncio.gather(*tasks)


if __name__ == '__main__':
    asyncio.run(main())
JosefKorbel Sep 02 2020 at 03:58

Puoi provare qualcosa di simile se tutte le funzioni fanno la stessa cosa


inputs = ['a', 'b', 'c']

async def task(input: str):
    # Do stuff / await stuff
    return input
   
async def main()
    await asyncio.wait(
        [task(arg) for arg in inputs]
    )