Безопасно ли создавать цикл событий asyncio в одном потоке и запускать его в другом потоке, имея возможность отменить егPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Безопасно ли создавать цикл событий asyncio в одном потоке и запускать его в другом потоке, имея возможность отменить ег

Сообщение Anonymous »

Я хочу знать, безопасно ли создавать цикл событий asyncio в одном потоке и запускать его в другом, имея при этом возможность отменить его из-за пределов потока, в котором выполняется цикл событий. Я хочу запустить асинхронную функцию в потоке и при этом иметь возможность отменить ее извне потока.
Вот код, который я сейчас использую. Я хочу знать, правильный ли это подход или есть более простой/лучший способ сделать это:

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

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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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