varsayalım engellenmeyen fonksiyonu içine bir engelleme işlevini nasıl dönüştürüleceğini karıştı:Python Tornado - Uzun koşu fonksiyonu var
def long_running_function():
result_future = Future()
result = 0
for i in xrange(500000):
result += i
result_future.set_result(result)
return result_future
Yukarıdaki sonuçla kullanıcıyı yazdıran bir işleyici bir get fonksiyonu var For döngüsünün o xrange tüm numarasını ekler: Ben aynı anda iki web tarayıcılarda yukarıdaki kodu çalıştırırsanız
@gen.coroutine
def get(self):
print "start"
self.future = long_running_function()
message = yield self.future
self.write(str(message))
print "end"
, alıyorum:
başlangıç
uç
başlangıç engelleme gibi görünüyor
uç
. Anladığım kadarıyla, @gen.coroutine
ve yield
bildirimi, get işlevindeki IOLoop'u engellemez, ancak, ko-rutinin içinde yer alan herhangi bir işlev varsa, IOLoop'u engeller.
Bu nedenle yaptığım diğer şey, long_running_function
ürününü geri aramak ve yield gen.Task
yerine kullanmaktır.
@gen.coroutine
def get(self):
print "start"
self.future = self.long_running_function
message = yield gen.Task(self.future, None)
self.write(str(message))
print "end"
def long_running_function(self, arguments, callback):
result = 0
for i in xrange(50000000):
result += i
return callback(result)
Bu da kesmiyor, beni veriyor:
başlangıç
uç
başlangıç
uç
ben bu yürütmek için konuları kullanabilirsinizParalel, ama gitmek için yol gibi görünmüyor, çünkü çok fazla thre açıyor olabilir reklamlar ve Tornado'nun kullanım kılavuzuna göre, pahalı olabilir.
İnsanlar Tornado için async kütüphaneleri nasıl yazıyor?
Doğru olduğunu düşünüyorum, ama [Çağrı engelleme işlevleri] (htt p: //www.tornadoweb.org/en/stable/guide/coroutines.html#calling-blocking-functions) CPU'yu ya da olaya bağlı olduğundan bahsetme, sadece şöyle diyor: "En basit yol Bir koroutinden engelleme işlevi, Coroutines ile uyumlu Futures'ı döndüren bir ThreadPoolExecutor kullanmaktır. " –