2015-04-16 32 views
6

Có ai đó đã quản lý để làm cho Cython làm việc với một corseine Asyncio không? Tôi có một ví dụ rất nhỏ mà hoạt động tốt trong Python, và từ chối làm việc trong Cython: đó là tập tin duy nhất mà tôi biên dịch với Cython và thực hiện. Việc thực thi bắt đầu chính xác nhưng không chạy được coroutine. Có vẻ như Cython sửa đổi loại coroutine "sometask", mà sau đó không được xử lý như bình thường bởi Asyncio và Inspect.Sử dụng Cython với 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: Hiện nay tôi làm cho nó "làm việc" bằng cách thay đổi một cách xấu xí của asyncio/file tasks.py ở những nơi mà nó sẽ kiểm tra nếu đối tượng là một máy phát điện, trong khi trên thực tế Cython đã làm cho nó tích hợp sẵn -in chức năng. Đối tượng Cython này sẽ vẫn làm công việc của một corseine asyncio, mặc dù nó có một kiểu khác với mong đợi.

+0

Trông giống như lỗi: https://groups.google.com/forum/#!topic/ Người dùng cython/3NdxAdz97eU – dano

+0

Cảm ơn, tôi đã sao chép câu trả lời của Stefan Behnel, có thể ai đó đã tìm ra giải pháp cho vấn đề này: "Tôi đoán là nó là một lỗi trong asyncio. Nó đặc biệt là các trường hợp " types.GeneratorType ", và trình tạo của Cython không phải loại đó Xem "_COROUTINE_TYPES" và "iscoroutine()" trong asyncio/coroutines.py. Đáng buồn thay, không có ABC cho máy phát điện bằng Python. Stefan " – MoriB

Trả lời

2

May mắn thay, Stefan Behnel đã giải quyết vấn đề này trong phiên bản cuối cùng của nhánh master của Cython.

EDIT: Các cam kết rằng giải quyết tất cả các vấn đề này là c8a2d30806b4e479515d44ee827b3a1651ac8731

Một có lẽ giải pháp thích hợp hơn sẽ được ở bên Python, đặc biệt là ở Asyncio, để xác định máy phát điện mà không kiểm tra kiểu của chúng. Giải pháp đầy đủ yêu cầu Python 3.4.2 (chắc chắn> Python 3.4.0) Liên kết để biết thêm chi tiết: https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM

Các vấn đề liên quan