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
    })
Вернуться на верх