2016-04-17 15 views
9

Chương trình xoắn của tôi hoạt động nhưng bây giờ tôi gặp vấn đề với một trong các lò phản ứng của tôi không chuyển ưu tiên cho các lò phản ứng khác. Tôi muốn các lò phản ứng controlListener để làm một lần lặp và sau đó vượt qua ưu tiên cho các lò phản ứng in ấn.Lỗi logic xoắn

#Random class as proof of concept 
class printStuffs(object): 
     print "counting " 
     printerCount = 0 
     def count(self): 
      self.printerCount = self.printerCount + 1 
      print ("the counter is at " + str(self.printerCount)) 

    ########################################################################## 
    ## The control listneer class is designed to kill given reactor threads ## 
    ## on demand from something once it recieves a signal it is supposed ## 
    ## to do one ieteration then release         ## 
    ########################################################################## 

    class controlListener(object): 
      counter = 20 
      def count(self): 
       if self.counter == 0: 
        print "Killing Process" 
        reactor.stop() 
       else: 
        print self.counter, '...' 
        self.counter -= 1 
        reactor.callLater(1, self.count) 

from twisted.internet import reactor 

print "Printing random stuff" 
reactor.callWhenRunning(printStuffs().count) 

print "Intializing kill listner" 
reactor.callWhenRunning(controlListener().count) 
reactor.run() 

print "Process killed" 

đây là sản phẩm

Printing random stuff 
    Intializing kill listner 
    the counter is at 1 
    20 ... 
    19 ... 
    18 ... 
    17 ... 
    16 ... 
    15 ... 
    14 ... 
    13 ... 
    12 ... 
    11 ... 
    10 ... 
    9 ... 
    8 ... 
    7 ... 
    6 ... 
    5 ... 
    4 ... 
    3 ... 
    2 ... 
    1 ... 
    Killing Process 
    Process killed 

Tôi muốn nó để làm một cái gì đó giống như

the counter is at 1 
20 ... 
the counter is at 2 
the counter is at 3 
19 ... 

, vv

Bất kỳ ý tưởng?

+2

Tôi không bao giờ sử dụng xoắn, nhưng nó có thể được rằng 'printStuffs.count()' chỉ đơn giản là không sử dụng 'reactor.callLater()' để sắp xếp lại chính nó như 'controlListener.count()' không? – Norman

+0

bạn nhận được nó, nếu bạn muốn bản sao tín dụng của bạn đăng bài vào một câu trả lời thực tế và tôi sẽ trao nó. –

+1

Bạn đã nhận được câu trả lời nhưng tôi chỉ muốn thông báo rằng có một LoopingCall bị xoắn (https://twistedmatrix.com/documents/current/api/twisted.internet.task.LoopingCall.html), cho phép bạn không phải rescedule các cuộc gọi lặp đi lặp lại theo cách thủ công. –

Trả lời

6

Bạn chỉ cần quên thực hiện printStuffs.count() lên lịch lại bằng cách sử dụng reactor.callLater(), như controlListener.count().

class printStuffs(object): 
    printerCount = 0 
    def count(self): 
     self.printerCount = self.printerCount + 1 
     print ("the counter is at " + str(self.printerCount)) 
     reactor.callLater(1, self.count) 

Ngoài ra, việc đưa một tuyên bố in (print "counting") trực tiếp trong định nghĩa lớp chứ không phải trong một chức năng làm cho nó được chạy ngay khi người phiên dịch python đọc định nghĩa lớp. Điều này là gây hiểu nhầm bởi vì thông điệp nói "đếm" nhưng không có gì thực sự xảy ra tại thời điểm đó (chưa).


Đây có thể là một trong những lỗi mà nếu không nhìn thấy thì người ta không thấy.
Đó là lý do tại sao đối với một số chức năng hoặc chủ đề quan trọng, tôi thêm câu lệnh ghi nhật ký vào mã cho biết khi nào chức năng được gọi hoặc khi chuỗi bắt đầu khi kết thúc. Điều này đặc biệt hữu ích cho các chức năng có thể bị hủy do lỗi và các chủ đề mà bạn mong muốn chạy hầu hết thời gian.

Đây là cách bạn có thể thích nghi với mô hình này với ví dụ của bạn:

class printStuffs(object): 
    printerCount = 0 
    def count(self): 
     try: 
      ##print "Entering printStuffs.count()." 
      self.printerCount = self.printerCount + 1 
      print ("The counter is at " + str(self.printerCount)) 
      # Run again later. 
      reactor.callLater(1, self.count) 
     except: 
      # We won't run again later. 
      print "Error in printStuffs.count(), won't run again:", sys.exc_info()[0] 
      # Don't swallow the exception. 
      raise 
     finally: 
      ##print "Leaving printStuffs.count()." 

Tất nhiên, đây sẽ là quá mức cần thiết ví dụ của bạn, nhưng mã thực của bạn có lẽ là phức tạp hơn.

Khi chương trình của bạn ngày càng trở nên phức tạp hơn, việc sử dụng đăng nhập theo cách này sẽ giúp bạn xác minh rằng các quy trình cơ bản trong chương trình của bạn đang hoạt động như dự định.