2015-06-15 19 views
9

Tôi đang cố gắng để chạy ví dụ này từ python asyncio tasks & coroutines documentationensure_future không có sẵn trong mô-đun asyncio

import asyncio 

@asyncio.coroutine 
def slow_operation(future): 
    yield from asyncio.sleep(1) 
    future.set_result('Future is done!') 

def got_result(future): 
    print(future.result()) 
    loop.stop() 

loop = asyncio.get_event_loop() 
future = asyncio.Future() 
asyncio.ensure_future(slow_operation(future)) 
future.add_done_callback(got_result) 
try: 
    loop.run_forever() 
finally: 
    loop.close() 

Tuy nhiên, tôi nhận được lỗi này:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'ensure_future' 

Đây là dòng mà dường như được gây ra tôi đau buồn:

asyncio.ensure_future(slow_operation(future)) 

Trình thông dịch trăn của tôi là 3.4.3 trên OSX Yosemite, như là rsion của tài liệu tôi liên kết với ở trên, từ đó tôi đã sao chép ví dụ, vì vậy tôi không nên nhận được lỗi này. Dưới đây là một thiết bị đầu cuối-lấy của thông dịch viên python của tôi:

Python 3.4.3 (default, Feb 25 2015, 21:28:45) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 

ví dụ khác từ trang không tham khảo asyncio.ensure_future dường như để làm việc.

Tôi cố gắng mở một phiên dịch viên tươi và nhập khẩu ensure_future từ asyncio

from asyncio import ensure_future 

tôi nhận được một lỗi nhập khẩu:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: cannot import name 'ensure_future' 

Tôi có quyền truy cập vào một máy chạy Ubuntu 14.04 với python 3.4.0 Cài đặt. Tôi đã thử nhập khẩu tương tự ở đó, và tiếc là phải đối mặt với cùng một lỗi nhập khẩu.

Có api cho asyncio đã được thay đổi và nó không được phản ánh trong các ví dụ tài liệu, hoặc có thể có lỗi đánh máy và đảm bảo_function thực sự phải là thứ gì đó khác trong tài liệu?

Ví dụ này có hoạt động (hoặc ngắt) cho các thành viên khác của cộng đồng SO không?

Cảm ơn.

+1

'thông dịch viên python của tôi là 3.4.3 trên OSX Yosemite, như là phiên bản của tài liệu tôi liên kết với trên' - Như bạn biết, điều này là không đúng. Các tài liệu được [cập nhật liên tục] (https://mail.python.org/pipermail/python-list/2015-June/692446.html), rất tiếc, đôi khi điều này có nghĩa là các phương pháp mới được giới thiệu trong tài liệu trước khi chúng được phát hành thực sự . –

+0

Cảm ơn! đó là những gì được chỉ ra trong câu trả lời được chấp nhận. Thông thường, thư viện chuẩn python api không thay đổi với các nâng cấp phiên bản nhỏ, nhưng asyncio nằm trong thư viện chuẩn trên cơ sở tạm thời. Tôi nên nhận ra điều đó sớm hơn. –

+0

@haleemur Ali bạn có thể giúp cho việc này không? http://stackoverflow.com/q/38531354/6626256 – Omar

Trả lời

13

https://docs.python.org/3.4/library/asyncio-task.html#asyncio.ensure_future

asyncio.ensure_future(coro_or_future, *, loop=None)

Schedule the execution of a coroutine object: wrap it in a future. Return a Task object.

If the argument is a Future , it is returned directly.

New in version 3.4.4.

Đó là về nó cho "Who is to blame?". Và liên quan đến "What is to be done?":

asyncio.async(coro_or_future, *, loop=None)

A deprecated alias to ensure_future().

Deprecated since version 3.4.4.

+1

Xin chào. Làm thế nào bạn sẽ viết một codebase đơn hỗ trợ cả Python 3.4.3 và 3.4.4? –

+0

@AmirEldor Tôi để nó như một bài tập cho bạn. –

+1

Tôi đã suy nghĩ về việc làm một điều khủng khiếp với nếu sys.version_info. Sau đó, tôi nghĩ về một thử: except: khoản. Sau đó, tôi nghĩ nơi này không phải là để thảo luận về nó. –

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