2015-04-16 24 views
6

Czy ktoś zdołał sprawić, aby Cython działał z Corynine Asyncio? Mam bardzo trywialny przykład, który działa dobrze w Pythonie, i odmawia pracy w Cython: jest to następujący pojedynczy plik, który kompiluję z Cythonem i wykonuję. Wykonanie rozpoczyna się poprawnie, ale nie uruchamia współprogramu. Wygląda na to, że Cython modyfikuje typ coroutine "something", który nie jest traktowany jak zwykle przez Asyncio i Inspect.Używanie Cythona z 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: Obecnie robię to „praca”, modyfikując w ten sposób brzydkie asyncio plik/tasks.py w miejscach, gdzie sprawdza, czy obiekt jest generator, podczas gdy w rzeczywistości Cython sprawiły, że wbudowany -w działaniu. Ten obiekt w języku Cython nadal będzie działał jako corynine asyncio, mimo że ma inny typ niż oczekiwano.

+0

Wygląda błędu: https://groups.google.com/forum/#!topic/ Cython-users/3NdxAdz97eU – dano

+0

Dzięki, kopiuję i wklejaję odpowiedź Stefana Behnela, być może ktoś znalazł sposób obejścia tego problemu: "Domyślam się, że jest to błąd w asyncio, w specjalnych przypadkach: " types.GeneratorType ", a generatory Cythona to nie tego typu. Patrz "_COROUTINE_TYPES" i "iscoroutine()" w asyncio/coroutines.py. Niestety, nie ma ABC dla generatorów w Pythonie. Stefan " – MoriB

Odpowiedz

2

Na szczęście Stefan Behnel wykonał obejście tego problemu w swojej ostatniej wersji głównego oddziału Cythona.

EDIT: commit, który rozwiązuje wszystkie problemy jest c8a2d30806b4e479515d44ee827b3a1651ac8731

może bardziej odpowiednim rozwiązaniem byłoby po stronie Pythona, szczególnie w Asyncio, aby zidentyfikować generatory bez sprawdzania ich typ. Pełne rozwiązanie wymaga Python 3.4.2 (na pewno> Python 3.4.0) Link do więcej szczegółów: https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM

Powiązane problemy