Top.Mail.Ru
Ответы

Ошибка в асинхронном коде, asyncio

123456789101112
 async def main():   
    while True:   
        if <<condition>>:   
            task1 = asyncio.create_task(get_camera_1())   
            task2 = asyncio.create_task(get_camera_2())   

            await task1   
            await task2   

            counts_1 = detect_shelves_1()  
            counts_2 = detect_shelves_2()   
 

Мне необходимо, чтобы task 1 и task2 выполнялись параллельно.
Функции get_camera_1 и 2 берут скриншоты с камеры из видеопотока
detect_shelves_1 и 2 обрабатывает эти фото
но на выполнении detect_shelves_1 и 2 выдает ошибку - не найден файл
То есть task 1 и 2 не выполниилсь
Почему так? в чем ошибка
функции get_camera_1 и 2 заданы как асинхронные
detect_shelves_1 и 2 не асинхронные

По дате
По рейтингу
Аватар пользователя
Мастер

Проблема здесь в том, что когда используется await, выполнение сопрограмм (асинхронных функций) останавливается до тех пор, пока задача не завершится. В вашем коде await task1 и await task2 останавливают выполнение main() до тех пор, пока get_camera_1() и get_camera_2() не завершатся соответственно. Это означает, что detect_shelves_1() и detect_shelves_2() вызываются только после того, как получены все скриншоты, а не параллельно с получением каждого скриншота.

Чтобы исправить это и дать возможность выполнения detect_shelves_1() и detect_shelves_2() параллельно с получением скриншотов, вы можете использовать asyncio.gather() для запуска задач параллельно:

123456789101112131415161718192021222324252627282930313233343536373839
 import asyncio 
 
async def main(): 
    while True: 
        if <<condition>>: 
            task1 = asyncio.create_task(get_camera_1()) 
            task2 = asyncio.create_task(get_camera_2()) 
 
            # Подождать завершения обеих задач параллельно 
            await asyncio.gather(task1, task2) 
 
            # Получить результаты задач 
            result1 = task1.result() 
            result2 = task2.result() 
 
            counts_1 = detect_shelves_1(result1) 
            counts_2 = detect_shelves_2(result2) 
 
async def get_camera_1(): 
    # Получение скриншота с камеры 1 
    await asyncio.sleep(1)  # Представим, что это задержка получения скриншота 
    return screenshot_1 
 
async def get_camera_2(): 
    # Получение скриншота с камеры 2 
    await asyncio.sleep(1)  # Представим, что это задержка получения скриншота 
    return screenshot_2 
 
def detect_shelves_1(screenshot): 
    # Обработка скриншота с камеры 1 
    # Возможно, здесь происходит ошибка из-за отсутствия файла 
    return counts_1 
 
def detect_shelves_2(screenshot): 
    # Обработка скриншота с камеры 2 
    # Возможно, здесь происходит ошибка из-за отсутствия файла 
    return counts_2 
 
asyncio.run(main()) 

В этом коде asyncio.gather() используется для запуска get_camera_1() и get_camera_2() параллельно, а затем detect_shelves_1() и detect_shelves_2() вызываются с результатами соответствующих задач.