PythonShell.py:27: RuntimeWarning: сопрограмма 'get_info' никогда не ожидалась mpl.use ('AGG') - PullRequest
1 голос
/ 27 февраля 2020

Я хочу преобразовать следующую функцию в асинхронную функцию для выполнения асинхронных вызовов к конечной точке REST:

def get_info(data, url, mini_batch = 1000):
  responses = []

  for first in range(0, len(data), mini_batch):
      data = data[first:first+mini_batch].tolist()

      input_json_data = json.dumps(data)

      headers = {'Content-Type': 'application/json'}

      resp = requests.post(url, input_json_data, headers=headers)
      responses.append(json.loads(resp.text).get('result'))

  output = numpy.concatenate([numpy.array(i) for i in responses])
  return output

Я нашел этих примеров для Python 3. Это то, что я попробовал:

import asyncio

asynch def get_info(data, url, mini_batch = 1000):

  await asyncio.sleep(1)

  responses = []

  async for first in range(0, len(data), mini_batch):
      data = data[first:first+mini_batch].tolist()

      input_json_data = json.dumps(data)

      headers = {'Content-Type': 'application/json'}

      resp = requests.post(url, input_json_data, headers=headers)
      responses.append(json.loads(resp.text).get('result'))

  output = numpy.concatenate([numpy.array(i) for i in responses])
  return output

Затем я вызываю эту функцию следующим образом:

output = asyncio.run(get_info(data, url, mini_batch))

Но я получаю сообщение об ошибке:

TypeError: 'async for' requires an object with __aiter__ method, got range

Что не так?

ОБНОВЛЕНИЕ:

Это то, что я пытался использовать предложение относительно aiohttp:

import aiohttp
import asyncio

async def fetch(session, url, headers, input_json_data):
    async with session.post(url, input_json_data, headers) as response:
        return await json.loads(response.text).get('result')


async def get_info(input_data, url):

  async with aiohttp.ClientSession() as session:
    input_json_data = json.dumps(input_data.tolist())
    headers = {'Content-Type': 'application/json'}
    output = await fetch(session, url, headers, input_json_data)

  return output

Вызов:

asyncio.run(get_info(data, url))

или

asyncio.gather(get_info(data, url))

Ошибка:

PythonShell.py: 27: RuntimeWarning: сопрограмма 'get_info' никогда не ожидалась mpl.use ('AGG') RuntimeWarning: Включить tracemallo c чтобы получить трассировку выделения объекта TypeError: post () принимает 2 позиционных аргумента, но было дано 4

или

RuntimeError: There is no current event loop in thread 'MainThread'
...