2015-04-17 18 views
7

Ho due processi; un processo principale e un sottoprocesso. Il processo principale sta eseguendo un ciclo di eventi asyncio e avvia il sottoprocesso. Voglio avviare un altro ciclo di eventi asyncio nel sottoprocesso. Sto usando il modulo aioprocessing per avviare il sottoprocesso.Asyncio event loop per processo python (aioprocessing, più loop di eventi)

La funzione sottoprocesso è:

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

ma ottengo un errore:

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. 

E 'possibile iniziare una nuova, o riavviare il, asyncio ciclo di eventi esistenti nel sottoprocesso ? Se é cosi, come?

+0

Come è il sottoprocesso iniziare? – tdelaney

+0

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

+2

Penso che "aioprocessing" sia stato scritto dal nostro stesso @dano. Potresti aggiungerlo al titolo per attirare la sua attenzione. – tdelaney

risposta

15

Ci scusiamo per il disturbo! Ho trovato una soluzione!

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

inserire questo codice per iniziare nuova ciclo di eventi asycnio all'interno del sottoprocesso avviato dal processo con asyncio ciclo di eventi

+3

Non c'è bisogno di essere dispiaciuto! [Le risposte alle tue domande] (http://stackoverflow.com/help/self-answer) sono più che benvenute, in quanto potrebbero aiutare i futuri visitatori! –

+0

È interessante. 'aloprocessing' passa attraverso' multiprocessing', il che significa che il bambino ha lo spazio di memoria genitore (almeno in linux). Quindi, c'è un ciclo di eventi non attivo che deve essere riavviato. – tdelaney

+0

Ho scoperto che asyncio controlla i loop nei thread, quindi il nuovo ciclo nella nuova discussione dovrebbe essere avviato senza domande. Supponiamo che un qualche tipo di gestore di atfork debba rimuovere automaticamente il loop di eventi inattivo, per aiutare l'avvio di un nuovo ciclo senza trucchi con la politica – solarw