Как построить сопрограмму Python Asyncio Base? - PullRequest
0 голосов
/ 31 марта 2019

Легко создать сопрограмму, которая вызывает другую сопрограмму, но если, например, я хочу создать сопрограмму, которая не блокирует, как мне это сделать?Должен ли я запустить поток, который выполняет эти вычисления, а затем каким-то образом перехватить обратный вызов?

Глядя на реализацию asyncio.sleep, они делают это, вызывая цикл, чтобы он возвращался позже во времени вместо "реального" сна

Я пришел к этому, но он все еще не работает.

import asyncio
import concurrent.futures


def inner_task(num_1, num_2):
    return num_1 ** num_2


async def exp_coroutine(num_1, num_2):

    executor = concurrent.futures.ProcessPoolExecutor()
    return await loop.run_in_executor(executor, inner_task, num_1, num_2)


async def my_base_coroutine(num_1, num_2):
    results = await exp_coroutine(num_1, num_2)
    print(results)
    return results


loop = asyncio.get_event_loop()
loop.create_task(my_base_coroutine(23, 876))
loop.create_task(my_base_coroutine(23, 1))
loop.create_task(my_base_coroutine(23, 35))

tasks = asyncio.Task.all_tasks()
loop.run_until_complete(asyncio.gather(*tasks))

В настоящее время я получаю результаты точно в том виде, в котором они запрашиваются, и ожидал, что сначала будут более простые вычисления.

...