2015-06-15 15 views
9

Próbuję uruchomić ten przykład z python asyncio tasks & coroutines documentationnie ensure_future dostępne w module 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() 

Jednak uzyskać ten błąd:

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

Jest to linia, która wydaje się być przyczyną ja żal:

asyncio.ensure_future(slow_operation(future)) 

Mój interpreter python jest 3.4.3 na OS X Yosemite, jak jest ve dokumentację, do której dołączyłem powyżej, z której skopiowałem przykład, więc nie powinien odbierać tego błędu w postaci. Oto terminal-grab mojego interpreter Pythona:

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. 

Inne przykłady ze strony nie odwołującego asyncio.ensure_future wydają się działać.

Próbowałem otwierając nową sesję interpretera i importowanie ensure_future z asyncio

from asyncio import ensure_future 

pojawia się błąd importowania:

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

Mam dostęp do innego komputera z systemem Ubuntu 14.04 z Python 3.4.0 zainstalowany. Próbowałem tego samego importu i niestety napotkałem ten sam błąd importu.

Czy api dla asyncio zostało zmienione, a nie zostało to po prostu odzwierciedlone w przykładach dokumentacji, a może jest literówka, a funkcja sure_function powinna być czymś innym w dokumentacji?

Czy przykład działa (lub łamie) dla innych członków społeczności SO?

Dzięki.

+1

«Mój jest interpreter Pythona 3.4.3 na OSX Yosemite, jak jest wersja dokumentacji I połączone powyżej» - jak już wiecie, to nie jest poprawna. Dokumenty są [ciągle aktualizowane] (https://mail.python.org/pipermail/python-list/2015-June/692446.html), więc niestety czasami oznacza to, że nowe metody są wprowadzane w dokumentach przed ich wydaniem . –

+0

Dzięki! to właśnie wskazano w zaakceptowanej odpowiedzi. Zwykle api biblioteki standardowej Pythona nie zmienia się wraz z niewielkimi uaktualnieniami wersji, ale asyncio jest tymczasowo w standardowej bibliotece. Powinienem to sobie uświadomić wcześniej. –

+0

@haleemur Ali możesz pomóc w tym? http://stackoverflow.com/q/38531354/6626256 – Omar

Odpowiedz

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.

To wszystko dla "Who is to blame?". Oraz dotyczące „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

Witaj. Jak napisałbyś jedną bazę kodów, która obsługuje zarówno Python 3.4.3, jak i 3.4.4? –

+0

@AmirEldor Zostawiam to jako ćwiczenie dla ciebie. –

+1

Myślałem o robieniu czegoś strasznego, jeśli sys.version_info. Potem pomyślałem o próbie: except: except. Wtedy pomyślałem, że to miejsce nie jest do dyskusji na ten temat. –