Асинхронное выполнение функции с помощью asyncio

def parse_and_send_message(message):
    pass

x = threading.Thread(target=parse_and_send_message, args=("HELLO!"))
x.start()

Как перевести данный код с использованием asyncio ?

Сама функция parse_and_send_message ничего не должна возвращать, внутри обработчик, который нужно выполнить в отдельном потоке, тк процесс занимает несколько секунд.


Ответы (1 шт):

Автор решения: vadim vaduxa
import threading, asyncio, random, time

def print2(message, n, sleep=False):
    if sleep: time.sleep(random.randint(50, 90) / 100)
    print(f'{n} {message} {threading.current_thread()}')

async def msg(message, n):
    for nn in range(n):
        await asyncio.sleep(random.randint(1, 30)/100)
        print2(message, nn, sleep=False)

async def main(n):
    await asyncio.gather(msg("HELLO-A", n), msg("HELLO-B", n),)

if __name__ == '__main__':
    for nn in range(10):
        threading.Thread(target=print2, args=["HELLO-T", nn], kwargs=dict(sleep=True)).start()
    asyncio.run(main(10))

out:

0 HELLO-A <_MainThread(MainThread, started 12400)>
1 HELLO-A <_MainThread(MainThread, started 12400)>
2 HELLO-A <_MainThread(MainThread, started 12400)>
0 HELLO-B <_MainThread(MainThread, started 12400)>
8 HELLO-T <Thread(Thread-9, started 5260)>
3 HELLO-A <_MainThread(MainThread, started 12400)>
0 HELLO-T <Thread(Thread-1, started 16608)>
3 HELLO-T <Thread(Thread-4, started 14520)>
5 HELLO-T <Thread(Thread-6, started 4452)>
2 HELLO-T <Thread(Thread-3, started 14544)>
9 HELLO-T <Thread(Thread-10, started 10820)>
1 HELLO-B <_MainThread(MainThread, started 12400)>
...
→ Ссылка