вот код, который я сейчас использую, я хочу знать, правильный ли это подход или есть ли более простой/лучший способ сделать это
Код: Выделить всё
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? оба они выдают одинаковый результат
[*]Можно ли повторно использовать цикл событий после его остановки или мне следует создавать новый цикл каждый раз после остановки цикл.
Нужно ли закрывать цикл после того, как вы с ним закончили.
Подробнее здесь: https://stackoverflow.com/questions/792 ... other-thre