Tôi có chức năng trình tạo python để tạo ra khối văn bản. Tôi muốn viết một phương thức get
cho một lớp con tornado.web.RequestHandler
sẽ lặp qua máy phát, viết các khối ra để phản hồi khi nó đi.Sử dụng trình tạo python đơn giản làm đồng bộ trong trình xử lý async Tornado?
Vì đây là Tornado và vì máy phát có thể mất hơn một giây để xử lý, tôi nghĩ sẽ tốt hơn nếu làm cho trình xử lý không đồng bộ, sử dụng trình tạo này làm đồng thời và chuyển điều khiển sang IOLoop sau mỗi chunk. Tuy nhiên, tôi không thể làm cho người đứng đầu hoặc đuôi của làm thế nào để làm điều này.
Dưới đây là ví dụ của tôi (chặn) mã:
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
Làm thế nào tôi có thể làm cho công việc xử lý này không đồng bộ?
Nó không thực sự rõ ràng những gì bạn sẽ đạt được. Bạn có muốn thoát khỏi get() trước khi tất cả các giá trị máy phát điện được lặp lại và quay lại khi các giá trị mới đã sẵn sàng chưa? Nếu vậy, hơn bạn không thể làm điều đó. Trong hàm cụ thể này, mã của bạn là một luồng đơn và nếu bạn thoát thì bối cảnh lỏng lẻo. Mặt khác, phương thức được đánh dấu là không đồng bộ mà thường ngụ ý trình xử lý được gọi là tạo thành một nhóm luồng, do đó, nó sẽ là OK để chặn ở đó. – real4x
Miễn là máy phát điện tồn tại, nó có tất cả ngữ cảnh tôi cần. Đó là vẻ đẹp của máy phát điện: đồng-thói quen trong một chủ đề duy nhất. Tất nhiên, bạn phải tự xử lý lịch trình, có lẽ đây là vấn đề thực sự ở đây. –