AsyncIO: программа по-прежнему выполняется синхронно, несмотря на использование AsyncIO в Django
Я создал API с именем APIDummyWait5
.
Теперь я хочу протестировать следующее
.
- Я хочу, чтобы API возвращало результат за несколько миллисекунд
.
- При этом функция, вызываемая внутри API, должна выполняться асинхронно.
API - APIDummyWait5
случайным образом генерирует число в диапазоне от 1 до 25, а затем отправляет его в качестве аргумента в функцию get_country_details
вместе с другим параметром под названием страна, который я буду получать из API url params.
Здесь находится API
class APIDummyWait5(APIView):
def get(self, request):
print("Coming Here")
worker = os.getpid()
thread = threading.get_ident()
country = request.GET.get('country')
print(f"API wait 5 - for worker - {worker} at Thread {thread} starting at: {datetime.datetime.now()}")
wait_time = rd.randint(1, 25)
response = {'wait_time': wait_time, 'country': country}
asyncio.run(main(wait_time=wait_time, country=country))
print(f"API Wait 5 - for worker - {worker} at Thread {thread} ending at: {datetime.datetime.now()}")
return Response({
"data": response
})
async def main(wait_time, country):
result = await get_country_details(wait_time, country)
Я создаю вспомогательную функцию с именем main
для вызова функции get_country_details
.
Функция get_country_details
фактически спит в течение времени ожидания, а затем вызывает сторонний API, чтобы получить название и столицу страны и сохранить их в csv.
async def get_country_details(wait_time, country):
worker = os.getpid()
print(f"API Quick @ {wait_time} - for worker - {worker} starting at: {datetime.datetime.now()}")
await asyncio.sleep(wait_time) # Simulate waiting time
url = f"https://restcountries.com/v3.1/name/{country}"
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
data = await response.json()
file = pd.read_csv('country_data.csv')
name_list = list(file['name'])
capital_list = list(file['capital'])
country_data = data[0]
country = country_data['name']['common']
capital = country_data['capital'][0]
name_list.append(country)
capital_list.append(capital)
new_data = pd.DataFrame({'name': name_list, 'capital': capital_list})
new_data.to_csv('country_data.csv', index=False)
print(f"Asynchronously Ran Function for {wait_time} seconds.")
return 1
else:
print(f"Error: Unable to fetch details for {country}")
return None
Теперь, если в случае wait_time = 11
то для возврата ответа потребуется 11 секунд, тогда как он должен быть возвращен за XX миллисекунд, поскольку основной API не требует много времени.
Почему это все еще выполняется синхронно и что я должен сделать, чтобы исправить это?
Я не хочу использовать потоки, я тестирую что-то с помощью asyncio.
Попробуйте заменить asyncio.run(main(wait_time=wait_time, country=country))
на asyncio.create_task(main(wait_time=wait_time, country=country))
:
class APIDummyWait5(APIView):
def get(self, request):
print("Coming Here")
worker = os.getpid()
thread = threading.get_ident()
country = request.GET.get('country')
print(f"API wait 5 - for worker - {worker} at Thread {thread} starting at: {datetime.datetime.now()}")
wait_time = rd.randint(1, 25)
response = {'wait_time': wait_time, 'country': country}
asyncio.create_task(main(wait_time=wait_time, country=country))
print(f"API Wait 5 - for worker - {worker} at Thread {thread} ending at: {datetime.datetime.now()}")
return Response({
"data": response
})