Я хочу преобразовать следующую функцию в асинхронную функцию для выполнения асинхронных вызовов к конечной точке 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'