Текущая летная миссия временно остановлена, при этом выполняется асинхронный цикл 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
Мобильная версия