2015-04-16 6 views
6

Hat es jemand geschafft, Cython mit einer Asyncio-Coroutine arbeiten zu lassen? Ich habe ein sehr triviales Beispiel, das in Python gut funktioniert, und weigert sich, in Cython zu arbeiten: es ist die folgende einzelne Datei, die ich mit Cython kompiliere und ausführe. Die Ausführung startet korrekt, aber die Coroutine kann nicht ausgeführt werden. Es sieht so aus, als ob Cython den Typ der "someask" -Coroutine ändert, der dann von Asyncio und Inspect nicht wie üblich behandelt wird.Verwenden von Cython mit 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: Derzeit ich es „Arbeit“ zu machen, indem die asyncio/tasks.py Datei an Orten, in einer hässlichen Art und Weise zu modifizieren, wo geprüft wird, ob das Objekt ein Generator ist, während in der Tat Cython es einen eingebauten gemacht -in Funktion. Dieses Cython-Objekt wird weiterhin die Arbeit einer asyncio-Coroutine ausführen, obwohl es einen anderen Typ als erwartet hat.

+0

wie ein Bug Aussehen: https://groups.google.com/forum/#!topic/ cython-users/3NdxAdz97eU – dano

+0

Danke, ich kopiere Stefan Behnel's Antwort, vielleicht hat jemand einen Workaround zu diesem Problem gefunden: "Ich vermute, dass es ein Fehler in asyncio ist. Es sind Sonderfälle " types.GeneratorType ", und Cythons Generatoren sind nicht von dieser Art. "_COROUTINE_TYPES" sehen und "iscoroutine()" in asyncio/coroutines.py. Leider gibt es kein ABC für Generatoren in Python. Stefan " – MoriB

Antwort

2

Glücklicherweise hat Stefan Behnel in seiner letzten Version von Cythons Master-Zweig eine Problemumgehung für dieses Problem erstellt.

EDIT: Das verpflichten, dass alle Probleme löst, ist c8a2d30806b4e479515d44ee827b3a1651ac8731

Eine vielleicht geeignetere Lösung auf dem Python Seite sein würde, vor allem in Asyncio, zu identifizieren Generatoren ohne ihre Art zu überprüfen. Eine vollständige Lösung erfordert Python 3.4.2 (sicher> Python 3.4.0) Link zu weiteren Informationen: https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM