Metin parçalarını veren bir python üreteci işlevim var. Ben gider yanıta parçalarını yerinden yazma, jeneratör yineleme olacak tornado.web.RequestHandler
alt sınıf için get
yöntemi yazmak istiyorum.Tornado async işleyicide basit bir python jeneratörü bir rutin olarak mı kullanılıyor?
Bu Tornado olduğundan ve jeneratörü işlemek için bir saniyeyi alabildiğinden beri, bu jeneratörü bir eş-rutin olarak kullanarak ve IOLoop'a her kontrolden sonra kontrolünü geçerek asenkronize etmek iyi olacağını düşündüm. yığın. Ancak, bunun nasıl yapılacağına dair kafa ya da kuyruk yapamam.
class TextHandler(web.RequestHandler):
@web.asynchronous
def get(self, n):
generator = self.generate_text(100000)
# Clearly, this will block. How to make it asynchronous?
for text in generator:
self.write(text)
def generate_text(n):
for x in xrange(n):
if not x % 15:
yield "FizzBuzz\n"
elif not x % 5:
yield "Buzz\n"
elif not x % 3:
yield "Fizz\n"
else:
yield "%s\n" % x
nasıl uyumsuz bu işleyici iş yapabilirsiniz:
İşte benim örnek (engelleme) kodu?
Hedefleriniz için neler olduğunu gerçekten net değil. Tüm jeneratör değerleri tekrarlanmadan önce get() öğesini bırakmak ve yeni değerler hazır olduğunda geri dönmek ister misiniz? Eğer öyleyse, bunu yapamazsın. Bu özel işlevde kodunuz tek bir iş parçacığıdır ve siz çıktıktan sonra bağlamı kaybedersiniz. Öte yandan, genellikle işleyiciyi ima eden asenkron olarak işaretlenen yönteme bir iplik havuzu denir, bu nedenle orada engellemek için Tamam olmalıdır. – real4x
Jeneratör mevcut olduğu sürece, ihtiyacım olan tüm içeriğe sahiptir. Bu jeneratörler güzelliği: Tek bir iş parçacığında rutinleri. Tabii ki, programlamayı kendiniz halletmelisiniz, ki bu belki de asıl sorun. –