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.
Sembra un insetto: https://groups.google.com/forum/#!topic/ cython-users/3NdxAdz97eU – dano
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