Возможно ли запустить только один шаг цикла событий asyncio

Я работаю над простым графическим сетевым приложением, используя asyncio и tkinter. Я столкнулся с проблемой объединения цикла событий asyncio с mainloop Tk. Если возможно, я бы хотел сделать это без потоков, потому что обе эти библиотеки (но особенно tkinter) не очень надежны в потоковом режиме. В настоящее время я использую Tk.update в asyncio coroutine, который запускает только одну итерацию цикла событий tk:

@asyncio.coroutine def run_tk(tk, interval=0.1): try: while True: tk.update() yield from asyncio.sleep(interval) except TclError as e: if "application has been destroyed" not in e.args[0]: raise 

Однако в интересах изучения всех опций мне было интересно, можно ли сделать обратное, если было возможно вызвать только одну итерацию цикла событий asyncio внутри обратного вызова tk.

  • Как получить доступ к id / widget из другого класса из файла kivy (.kv)?
  • Лучший способ получить название кнопки, которая называется событием?
  • Базовая карта Matplotlib: всплывающее окно
  • «Выбрать» в нескольких очередях многопроцессорности Python?
  • Как запускать события Google Analytics с Python?
  • Tkinter. После окна замораживания метода?
  • Создайте кадр данных Pandas со счетчиками элементов, охватывающих диапазон дат
  • Как сделать копию модуля python во время выполнения?
  • unicode и кодировка для персидского или арабского в python3
  • Как разбить отдельные элементы списка на число?
  • Как исправить ошибку кодирования при преобразовании списка в формат csv?
  • Является ли конкретный часовой пояс, используя DST прямо сейчас?
  • One Solution collect form web for “Возможно ли запустить только один шаг цикла событий asyncio”

    Отсутствует общедоступный метод, такой как loop.run_once() . Не каждый поддерживаемый цикл событий имеет метод для повторения одного шага. Часто базовый API имеет методы для создания цикла событий и запуска его навсегда, но эмулирование одного шага может быть очень неэффективным.

    Если вам это действительно нужно, вы можете реализовать одноступенчатую итерацию:

     import asyncio def run_once(loop): loop.call_soon(loop.stop) loop.run_forever() loop = asyncio.get_event_loop() for i in range(100): print('Iteration', i) run_once(loop) 
    Python - лучший язык программирования в мире.