Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass parameters to multiple async tasks in Python

Right now I have some code that looks like this:

    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())

As you can see above, I have 3 async functions that do separate things simultaneously. I was wondering if theres any way to easily create many functions based off of user input? Essentially what I want to have it be able to do is this:

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

And then once it had gotten that data it would run like this 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())

So pretty much it would make functions based off of certain veriables (such as userinput1) and then do this however many times specified (amount_of_needed_functions) and then run all of these simultaneously. Sorry this is a bit of confusing question but I'm quite lost as where to start researching this. Thanks!

like image 851
cordmana Avatar asked Sep 17 '25 12:09

cordmana


1 Answers

Pass user input as an argument to each task:

Single Function For Multiple Tasks

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())

Multiple Functions For Multiple Tasks

Use a dictionary to invoke your desired method for each 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())
like image 61
Aviv Yaniv Avatar answered Sep 20 '25 04:09

Aviv Yaniv