Cara meneruskan parameter ke beberapa tugas asinkron dengan Python

Sep 02 2020

Saat ini saya memiliki beberapa kode yang terlihat seperti ini:

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

Seperti yang Anda lihat di atas, saya memiliki 3 fungsi asinkron yang melakukan hal-hal terpisah secara bersamaan. Saya bertanya-tanya apakah ada cara untuk membuat banyak fungsi dengan mudah berdasarkan input pengguna? Pada dasarnya apa yang saya ingin agar dapat dilakukan adalah ini:

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

Dan kemudian setelah mendapatkan data itu, itu akan berjalan seperti skrip ini:

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

Jadi cukup banyak itu akan membuat fungsi berdasarkan veriable tertentu (seperti userinput1) dan kemudian melakukan ini beberapa kali yang ditentukan (jumlah_of_needed_functions) dan kemudian menjalankan semua ini secara bersamaan. Maaf ini adalah pertanyaan yang agak membingungkan tetapi saya cukup bingung dari mana harus mulai meneliti ini. Terima kasih!

Jawaban

1 AvivYaniv Sep 02 2020 at 04:06

Berikan masukan pengguna sebagai argumen untuk setiap tugas:

Fungsi Tunggal Untuk Banyak Tugas

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

Beberapa Fungsi Untuk Beberapa Tugas

Gunakan kamus untuk memanggil metode yang Anda inginkan untuk setiap masukan.

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

Anda dapat mencoba sesuatu seperti ini jika semua fungsi melakukan hal yang sama


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