2010-08-18 34 views
5

Deferred s là một cách tuyệt vời để xử lý không đồng bộ trong Twisted. Tuy nhiên, chúng giống như tên của nó, là các tính toán được hoãn lại, chỉ chạy và kết thúc một lần, kích hoạt các cuộc gọi lại một lần. Điều gì xảy ra nếu tôi có tính toán lặp lại, giống như một nút được nhấp? Có bất kỳ đối tượng nào giống như Deferred có thể kích hoạt liên tục, gọi tất cả các cuộc gọi lại được gắn với nó bất cứ khi nào nó được kích hoạt?Xoắn: hoãn lại mà cháy liên tục?

+1

Đó là nghĩa đen đã được bốn năm, nhưng ai đó đã cho tôi một rất thỏa đáng [ở đây] (http://stackoverflow.com/a/27996359/2419669). – yangmillstheory

Trả lời

3

Tôi đã thiết lập tính năng này ngay bây giờ. Đối với trường hợp sử dụng hạn chế của tôi nó làm những gì tôi muốn.

class RepeatedDeferred: 
    def __init__(self): 
     self.callbacks = [] 

     self.df = defer.Deferred() 

    def addCallback(self, callback): 
     self.callbacks.append(callback) 

     self.df.addCallback(callback) 

    def callback(self, res): 
     self.df.callback(res) 

     self.df = defer.Deferred() 
     for c in self.callbacks: 
      self.df.addCallback(c) 

Ai đó cho tôi biết nếu điều này thật khủng khiếp.

0

Những gì bạn có thể đang tìm kiếm là defer.inlineCallbacks cho phép bạn sử dụng trình tạo để tạo chuỗi chuỗi trì hoãn tuần tự. Về cơ bản bạn chỉ có thể tạo ra một máy phát điện mà không bao giờ kết thúc (hoặc kết thúc có điều kiện) và tiếp tục tạo ra hoãn lại từ đó.

Có ghi chú tuyệt vời khi sử dụng inlineCallbacks tại krondo.com.

+0

tính năng tuyệt vời của heh. nhắc nhở tôi về các monads trong Haskell, kinda. Tôi không nghĩ rằng đó là những gì tôi đang tìm kiếm, mặc dù. tôi sẽ nghĩ về nó nhiều hơn khi nó không quá muộn – Claudiu

Các vấn đề liên quan