Цикл событий Asyncio для каждого процесса Python (обработка aioprocessing, несколько циклов событий)

У меня два процесса; основной процесс и подпроцесс. Основной процесс запускает цикл событий asyncio и запускает подпроцесс. Я хочу запустить еще один цикл событий asyncio в подпроцессе. Я использую модуль aioprocessing для запуска подпроцесса.

Функция подпроцесса:

def subprocess_code():
     loop = asyncio.get_event_loop()
     @asyncio.coroutine
     def f():
        for i in range(10):
            print(i)
            yield from asyncio.sleep(1)
     loop.run_until_complete(f())

Но получаю ошибку:

    loop.run_until_complete(f())
  File "/usr/lib/python3.4/asyncio/base_events.py", line 271, in run_until_complete
    self.run_forever()
  File "/usr/lib/python3.4/asyncio/base_events.py", line 239, in run_forever
    raise RuntimeError('Event loop is running.')
RuntimeError: Event loop is running.

Можно ли запустить новый или перезапустить существующий asyncio цикл обработки событий в подпроцессе? Если да, то как?


person solarw    schedule 17.04.2015    source источник
comment
Как запускается подпроцесс?   -  person tdelaney    schedule 17.04.2015
comment
process = aioprocessing.AioProcess (цель = цель) process.start ()   -  person solarw    schedule 17.04.2015
comment
Я думаю, что aioprocessing был написан нашим собственным @dano. Вы можете добавить это к заголовку, чтобы привлечь его внимание.   -  person tdelaney    schedule 17.04.2015
comment
@tdelany Я все равно нашел вопрос :). Я написал об этом ошибку, когда сначала работал над aioprocessing: bugs.python.org/issue22087   -  person dano    schedule 17.04.2015


Ответы (1)


Извините за беспокойство! Я нашел решение!

policy = asyncio.get_event_loop_policy()
policy.set_event_loop(policy.new_event_loop())
loop = asyncio.get_event_loop()

поместите этот код, чтобы запустить новый цикл событий asycnio внутри подпроцесса, запущенного из процесса с циклом событий asyncio

person solarw    schedule 17.04.2015
comment
Не нужно извиняться! Ответы на ваши вопросы более чем приветствуются, так как они могут помочь будущим посетителям! - person Andrea Corbellini; 17.04.2015
comment
Это интересно. aioprocessing проходит через multiprocessing, что означает, что у дочернего элемента есть родительская область памяти (по крайней мере, в Linux). Итак, есть неактивный цикл событий, который необходимо перезапустить. - person tdelaney; 17.04.2015
comment
Я обнаружил, что asyncio проверяет циклы в потоках, поэтому новый цикл в новом потоке должен запускаться без вопросов. Предположим, что какой-то обработчик atfork должен автоматически удалять неактивный цикл событий, чтобы помочь запустить новый цикл без трюков с политикой. - person solarw; 17.04.2015
comment
@solarw В ошибке, на которую я ссылался выше, есть патч, который работает с этой проблемой, но похоже, что есть еще один патч для еще одной похожей ошибки, которая реализует обработчики типа atfork для ее устранения. См. Здесь: bugs.python.org/issue21998. Однако на нем не было активности в течение нескольких месяцев. На данный момент то, что вы делаете, - это правильный способ обойти проблему. - person dano; 17.04.2015
comment
обратите внимание, что это сломалось в 3.5.3, патч находится в разработке: github.com/python/asyncio/ тянуть / 452 - person amohr; 01.03.2017