2015-04-16 21 views
6

Qualcuno è riuscito a far funzionare Cython con una coroutine Asyncio? Ho un esempio molto banale che funziona bene in Python e si rifiuta di lavorare in Cython: è il seguente singolo file che compilo con Cython ed eseguo. L'esecuzione inizia correttamente ma non riesce a eseguire la coroutine. Sembra che Cython modifichi il tipo della coroutine "sometask", che non viene quindi trattata come al solito da Asyncio e Inspect.Utilizzo di Cython con Asyncio (Python 3.4)

#!/usr/bin/env python 

import asyncio 


@asyncio.coroutine 
def sometask(): 
    counter = 0 
    while True: 
     print(counter) 
     yield from asyncio.sleep(1) 
     counter += 1 

def runloop(): 
    loop = asyncio.get_event_loop() 
    asyncio.async(sometask()) 
    try: 
     print('Start loop') 
     loop.run_forever() 
    except KeyboardInterrupt: 
     print('Aborted by user') 
     loop.close() 

UPDATE: Attualmente mi rendono "lavoro" modificando in maniera brutta file asyncio/tasks.py in luoghi in cui esso controlla se l'oggetto è un generatore, mentre in realtà Cython ha reso un costruito -in funzione. Questo oggetto Cython farà comunque il lavoro di una coroutine asyncio, anche se ha un tipo diverso dal previsto.

+0

Sembra un insetto: https://groups.google.com/forum/#!topic/ cython-users/3NdxAdz97eU – dano

+0

Grazie, ho copiato e incollato la risposta di Stefan Behnel, forse qualcuno ha trovato una soluzione a questo problema: "La mia ipotesi è che si tratta di un bug in asyncio.I casi speciali " types.GeneratorType ", ei generatori di Cython sono non di quel tipo. Vedere "_COROUTINE_TYPES" e "iscoroutine()" nel asyncio/coroutines.py. Purtroppo, non v'è alcuna ABC per i generatori in Python. Stefan " – MoriB

risposta

2

Fortunatamente, Stefan Behnel ha risolto il problema nella sua ultima versione del ramo principale di Cython.

EDIT: Il commit che risolve tutti i problemi è c8a2d30806b4e479515d44ee827b3a1651ac8731

Una soluzione forse più appropriata sarebbe sul lato Python, in particolare in Asyncio, per identificare generatori senza controllare il loro tipo. Una soluzione completa richiede Python 3.4.2 (di sicuro> Python 3.4.0) link di maggiori dettagli: https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM

Problemi correlati