Kafamı, birlikte zincirleme zincirleri etrafında sarmakla ilgili sorun yaşıyorum.asyncio (ve gözlemci deseninde) zincirleme koroutinleri
#!/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()
bu beklenir: merhaba dünya ya faktöriyellerin göre biraz daha az önemsiz örnekte, sürekli dosya değişiklik zamanları izler ve ardından dosya değdiği anda zaman aşımına yazdıran bir döngü var istiyorum Çalışır - ancak, çalıştırdığımda, şunu alırım:
RuntimeError: Task got bad yield: 1426449327.2590399
Burada yanlış olan ne yapıyorum?
GÜNCELLEME: geri aramaları kullanmadan (Görevler kullanmanız gerekir) gözlemci kalıbı örneği için (örneğin, bir dosyaya dokunduğunda birden çok kayıt aracının bir dosyaya dokunulduğunda güncelleştirmelerin verimli bir şekilde izin vermesine izin vermek için) aşağıdaki cevabıma bakın.
Update2: sadece chained coroutines example gibi https://www.python.org/dev/peps/pep-0492/
Teşekkür biraz daha onlar bir eşyordam sadece iade veya gelen verim açık bir biçimde ifade fark dokümanlar baktıktan sonra - Basit bir verim izin verilmez. Neden koroutinlerin normal bir jeneratör gibi verimi kullanamadıklarını merak ediyorum. – gnr
Evet, meraklı. 'Rota izleyicisini' normal bir jeneratör olarak yeniden yazabilir ve uykuyı 'yazıcıya taşıyabilirsiniz. Ama sanırım zincirli bir koroutin istedin. –
Ah ilginç bir fikir - Ne bulabileceğimi görmek için biraz oynarım. Bir dosyaya ne zaman dokunduğumu bildirmek için geri aramaları kullanan kütüphane kodum var ve bunu (veya geri aramalar olmadan) koroutinler ile nasıl çalıştırılacağını görmek istiyorum. Dosyaya dokunduğunda, farklı bir şey yapabilecek bir yazıcı işlevi veya bir kayıt fonksiyonu veya bir soket işlevi olurdu. – gnr