Почему этот асинхронный цикл событий заблокирован?Python

Программы на Python
Ответить
Anonymous
 Почему этот асинхронный цикл событий заблокирован?

Сообщение Anonymous »

У меня есть приложение на Python, которое обеспечивает удаленное управление дроном. В основном я использую традиционную многопоточность, но мне приходится поддерживать и асинхронное программирование, поскольку некоторые сторонние библиотеки настаивают на его использовании. В настоящее время у меня следующая ситуация:
Текущая летная миссия временно остановлена, при этом выполняется асинхронный цикл while, который постоянно проверяет флаг возобновления и ждет несколько миллисекунд с использованием asyncio.sleep. . За это время веб-сокет получает команду на корректировку угла отклонения дрона. При этом запускается новый поток, который запускает соответствующий код дрона. Однако этот код никогда не выполняется, цикл while, похоже, блокирует все выполнение дальнейшего асинхронного кода, несмотря на постоянные вызовы asyncio.sleep.
Следующий sscce иллюстрирует процесс:

Код: Выделить всё

import asyncio
import threading
import time
from concurrent.futures import ThreadPoolExecutor

class Drone():

def __init__(self):
self.ex = ThreadPoolExecutor(max_workers=5)
self.base_loop = asyncio.get_event_loop()

async def run(self):
print("Mission was temporarily halted, starting waiting loop...")
while True:
await asyncio.sleep(.2)

async def adjust_yaw(self):
print("Yaw angle adjusted.")

def sender(self):
time.sleep(2)
print("adjusting yaw angle...")
asyncio.run_coroutine_threadsafe(self.adjust_yaw(), self.base_loop)

if __name__ == '__main__':

drone = Drone()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

th = threading.Thread(target=drone.sender, name="MissionRunner", args=[])
th.start()

loop.run_until_complete(drone.run())
Как видите, «регулировка угла отклонения от курса...» никогда не отображается.
Как лучше всего это сделать? разблокировать этот цикл?
Было бы здорово, если бы изменения можно было ограничить методом отправителя. Как уже упоминалось, я включаю asyncio просто потому, что мне нужно, и я не хотел бы вносить большие изменения в свою рабочую базу кода только из-за этой одной библиотеки.

Подробнее здесь: https://stackoverflow.com/questions/792 ... op-blocked
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»