Mam problem z zawijaniem głowy wokół tego, jak połączone są łańcuchy. W nieco mniej trywialny przykład niż Hello World czy silni, chciałbym mieć pętlę, która stale zegarki czasy modyfikacji pliku, a następnie drukuje się czas, kiedy plik został dotknięty:Łączenie łańcuchów w asyncio (i wzorzec obserwatora)
#!/usr/bin/env python3
import os
import asyncio
@asyncio.coroutine
def pathmonitor(path):
modtime = os.path.getmtime(path)
while True:
new_time = os.path.getmtime(path)
if new_time != modtime:
modtime = new_time
yield modtime
yield from asyncio.sleep(1)
@asyncio.coroutine
def printer():
while True:
modtime = yield from pathmonitor('/home/users/gnr/tempfile')
print(modtime)
loop = asyncio.get_event_loop()
loop.run_until_complete(printer())
loop.run_forever()
spodziewałbym to do pracy - jednak po uruchomieniu otrzymuję:
RuntimeError: Task got bad yield: 1426449327.2590399
Co ja tu robię źle?
AKTUALIZACJA: zapoznaj się z poniższą odpowiedzią, aby zobaczyć przykład wzorca obserwatora (tzn. Sprawnie umożliwić wielu rejestrującym pobieranie aktualizacji po dotknięciu pliku) bez korzystania z wywołań zwrotnych (musisz użyć Zadania).
Update2: jest lepiej fix do tego: 3.5 za async for
(Asynchronous iteratory): https://www.python.org/dev/peps/pep-0492/
Dzięki za pomocny answer- po patrząc na docs nieco więcej zauważyłem, że stwierdzają oni, że współprogram może jedynie zwrócić lub wydajność od - prosty wydajność nie jest dozwolone. Zastanawiam się, dlaczego coroutines nie są w stanie wykorzystać wydajności jak normalnego generatora. – gnr
Tak, to ciekawe. Możesz przepisać 'pathmonitor' jako zwykły generator i przesunąć uśpienie do' drukarki'. Ale myślę, że chciałaś spętanego konwoju. –
Ach, to ciekawy pomysł - trochę się pobawię, żeby zobaczyć, co potrafię wymyślić. Mam kod biblioteki, który używa wywołań zwrotnych, aby powiadomić, kiedy plik zostanie dotknięty i chciałbym zobaczyć, jak sprawić, by działał on z coroutines (lub bez wywołań zwrotnych). Chciałbym mieć funkcję drukarki, funkcję rejestratora lub funkcję gniazda, która wszystko może zrobić inaczej, gdy zostanie dotknięty plik. – gnr