Как запустить асинхронную функцию навсегда (Python) - PullRequest
0 голосов
/ 22 мая 2018

Как использовать asyncio и запускать функцию навсегда.Я знаю, что есть run_until_complete(function_name), но как мне использовать run_forever, как вызвать асинхронную функцию?

async def someFunction():
    async with something as some_variable:
        # do something

Я не уверен, как запустить функцию.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

run_forever не означает, что асинхронная функция будет работать магическим образом вечно, это означает, что цикл будет выполняться вечно, или, по крайней мере, до тех пор, пока кто-то не вызовет loop.stop().Чтобы буквально запустить асинхронную функцию навсегда, вам нужно создать асинхронную функцию, которая это делает.Например:

async def some_function():
    async with something as some_variable:
        # do something

async def forever():
    while True:
        await some_function()

loop = asyncio.get_event_loop()
loop.run_until_complete(forever())

Вот почему run_forever() не принимает аргумент, его не волнует какая-либо конкретная сопрограмма.Типичным примером является добавление некоторых сопрограмм с использованием loop.create_task или эквивалентного перед вызовом run_forever().Но даже цикл обработки событий, который не выполняет никаких задач и работает вхолостую, может быть полезен, поскольку другой поток может вызвать asyncio.run_coroutine_threadsafe и заставить его работать.

0 голосов
/ 22 мая 2018

Я не уверен, что именно вы имеете в виду, когда говорите Я не уверен, как запустить функцию .Если вы задаете вопрос в буквальном смысле:

loop = asyncio.get_event_loop()
loop.run_forever()

Если вы хотите добавить функцию в цикл перед инициализацией цикла, тогда будет достаточно следующей строки до loop.run_forever():

asyncio.async(function())

Чтобы добавить функцию в уже запущенный цикл, вам понадобится ensure_future:

asyncio.ensure_future(function(), loop=loop)

В обоих случаях функция, которую вы собираетесь вызвать, должна быть обозначена какасинхронный, т.е. с использованием префикса функции async или декоратора @asyncio.coroutine.

...