Запустите функцию asyn c внутри нового потока - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь создать бот-диск, и мне нужно запустить функцию asyn c в другом новом потоке, так как основной поток необходим для запуска другой функции (Discord Client)

What I ' Я пытаюсь выполнить sh:

# This methods needs to run in another thread
async def discord_async_method():
    while True:
        sleep(10)
        print("Hello World")
        ... # Discord Async Logic

# This needs to run in the main thread
client.run(TOKEN)

thread = ""

try:
    # This does not work, throws error "printHelloWorld Needs to be awaited"
    thread = Thread(target=discord_async_method)
    thread.start()
except (KeyboardInterrupt, SystemExit):

    # Stop Thread when CTRL + C is pressed or when program is exited
    thread.join()

Я пробовал другие решения с помощью asyncio, но не смог заставить другие решения работать.

Продолжение: при создании потока как остановить этот поток, когда вы останавливаете программу, т.е. KeyboardInterupt или SystemExit?

Любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 11 апреля 2020

Вам не нужно привлекать потоки для параллельного запуска двух вещей в asyncio. Просто отправьте сопрограмму на событие l oop в качестве задачи перед запуском клиента.

Обратите внимание, что ваша сопрограмма не должна выполнять блокирующие вызовы, поэтому вместо вызова sleep() вам нужно дождаться asyncio.sleep() , (Это обычно относится к сопрограммам, а не только к раздорам.)

async def discord_async_method():
    while True:
        await asyncio.sleep(10)
        print("Hello World")
        ... # Discord Async Logic

# run discord_async_method() in the "background"
asyncio.get_event_loop().create_task(discord_async_method())

client.run(TOKEN)
...