Вот код, который я сейчас использую. Я хочу знать, правильный ли это подход или есть более простой/лучший способ сделать это:
Код: Выделить всё
import asyncio
from concurrent.futures import ThreadPoolExecutor, CancelledError
import time
pool = ThreadPoolExecutor()
loop = asyncio.new_event_loop()
def start_event_loop(loop):
asyncio.set_event_loop(loop) # is this necessary?
loop.run_forever()
pool.submit(start_event_loop, loop)
async def long_task():
try:
while True:
print("Running...")
await asyncio.sleep(1)
except asyncio.CancelledError:
print("Task was cancelled")
future = asyncio.run_coroutine_threadsafe(long_task(), loop)
time.sleep(5)
loop.call_soon_threadsafe(future.cancel)
try:
future.result()
except CancelledError:
time.sleep(1)
print("Future was cancelled")
loop.call_soon_threadsafe(loop.stop) # can i reuse the loop?
while loop.is_running():
print("Wating for loop to stop...")
time.sleep(0.1)
loop.close() # is this necessary?
print("Loop stopped")
Кроме того, я хотел бы задать еще несколько вопросов:
[*]Нужно ли использовать asyncio.set_event_loop? Оба они выдают один и тот же результат.
[*]Можно ли повторно использовать цикл событий после его остановки или мне следует каждый раз создавать новый цикл? после остановки цикла?
Нужно ли закрывать цикл после того, как вы с ним закончили?
< /li>
Подробнее здесь: https://stackoverflow.com/questions/792 ... other-thre