Сделать метод производного класса асинхронным - PullRequest
2 голосов
/ 02 апреля 2019

Мне нужно создать и использовать класс, полученный из вышестоящего пакета (не изменяемый) Я хочу / нужно добавить / изменить метод в производном классе, который должен быть асинхронным, потому что мне нужно дождаться отправки / записи websocket в методе Я пытался просто добавить асинхронный метод, но я получаю сообщение (из метода базового класса), что мой метод из производного класса RuntimeWarning: coroutine MyCopyProgressHandler.end was never awaited Есть ли способ "преобразовать" метод производного класса в асинхронный?

1 Ответ

1 голос
/ 02 апреля 2019

Когда вам нужно преобразовать метод синхронизации в асинхронное, у вас есть несколько различных опций . Второй (run_in_executor), вероятно, самый простой.

Например, вот как вы можете сделать функцию синхронизации requests.get для асинхронного запуска:

import asyncio
import requests
from concurrent.futures import ThreadPoolExecutor


executor = ThreadPoolExecutor(10)


async def get(url):
    loop = asyncio.get_running_loop()
    response = await loop.run_in_executor(
        executor, 
        requests.get, 
        url
    )
    return response.text


async def main():
    res = await get('http://httpbin.org/get')
    print(res)


asyncio.run(main())
...