Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Regalito Ученик (5), закрыт 1 месяц назад
 async def main():   
while True:
if <>:
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 не асинхронные
Лучший ответ
Леха Миронов Мастер (2428) 11 месяцев назад
Проблема здесь в том, что когда используется 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() для запуска задач параллельно:
 import asyncio 

async def main():
while True:
if <>:
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() вызываются с результатами соответствующих задач.
Остальные ответы
Похожие вопросы