2015-04-17 4 views
7

Ich habe zwei Prozesse; ein Hauptprozess und ein Subprozess. Der Hauptprozess führt eine asyncio Ereignisschleife aus und startet den Subprozess. Ich möchte eine weitere asyncio-Ereignisschleife im Subprozess starten. Ich benutze das Modul aioprocessing, um den Subprozess zu starten.Asyncio Ereignisschleife pro Python-Prozess (AIOprocessing, mehrere Ereignisschleifen)

Die subprocess Funktion ist:

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()) 

Aber ich erhalte eine Fehlermeldung:

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. 

Ist es möglich, eine neue zu starten, oder starten Sie den bestehenden, asyncio Ereignisschleife im subprocess ? Wenn das so ist, wie?

+0

Wie wird die Subprozess gestartet? – tdelaney

+0

process = aioprocessing.AioProcess (Ziel = Ziel) process.start() – solarw

+2

Ich denke, 'aioprocessing' wurde von unserem eigenen @dano geschrieben. Sie könnten es zum Titel hinzufügen, um seine Aufmerksamkeit zu erhalten. – tdelaney

Antwort

15

Entschuldigung für stören! Ich habe eine Lösung gefunden!

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

Put dieser Code neu asycnio Ereignisschleife innerhalb von subprocess zu starten begannen aus dem Prozess mit asyncio Ereignisschleife

+3

Kein Grund zur Entschuldigung! [Antworten auf Ihre eigenen Fragen] (http://stackoverflow.com/help/self-answer) sind mehr als willkommen, da sie zukünftigen Besuchern helfen können! –

+0

Das ist interessant. 'aioprocessing' geht durch' multiprocessing', was bedeutet, dass das Kind den Elternspeicherraum hat (zumindest in linux). Daher gibt es eine nicht aktive Ereignisschleife, die neu gestartet werden muss. – tdelaney

+0

Ich habe festgestellt, dass asyncio Schleifen bei Threads überprüft, so dass neue Schleife in neuen Thread ohne Fragen gestartet werden sollte. Angenommen, eine Art von Atfork-Handler sollte die inaktive Ereignisschleife automatisch entfernen, um den Start einer neuen Schleife ohne Tricks mit der Richtlinie – solarw

Verwandte Themen