Как я могу запланировать задачу с asyncio для запуска в executor? - PullRequest
0 голосов
/ 04 мая 2018

Я использовал asyncio для параллелизма, однако столкнулся с проблемой. Мне нужно запланировать задачу с помощью asyncio, но она блокируется, и поэтому я хотел бы выполнить ее в исполнителе, используя пул потоков из concurrent.futures.

Я видел такой пример: расписание задач:

now = loop.time()
loop.call_at(now + 60, callback, arg, loop)

и вот так запускаются задачи у исполнителей:

blocking_tasks = [
    loop.run_in_executor(executor, blocks)
    for i in range(6)
]
completed, pending = await asyncio.wait(blocking_tasks)

Но как мне запланировать выполнение задачи блокировки в executor?

1 Ответ

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

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

async def my_task():
    await asyncio.sleep(60)
    result = await loop.run_in_executor(None, fn)
    ...

taskobj = loop.create_task(my_task())

Преимущество заключается в том, что задача, созданная create_task, может быть отменена во время сна. Кроме того, вы можете вернуть полезное значение из my_task() и получить его, используя await taskobj, вызвав taskobj.result() или loop.run_until_complete(taskobj).

...