Come passare parametri a più attività asincrone in Python
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
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())
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]
)