2014-12-31 198 views
1

我有一個cmd.Cmd類命令行解釋器,例如,初始化一個self.counter = Counter()。從外部停止運行while循環

調用'start'後,do_start()將調用self.counter.start(),並且self.counter啓動一個從0到無窮大的while循環。

計數器

僞例如:

class Counter(object): 

    def __init__(self): 
     self.number = 0 
     self.running = False 

    def start(): 
     self.running = True 
     while self.running: 
      self.number += 1 

    def status(): 
     return self.number 

    def stop(): 
     self.running = False 

我怎麼能叫「狀態」在我cmd.Cmd類(調用do_status()),以獲得self.counter.status(),這將給當前已增加的數字?

如何在cmd.Cmd類中調用'stop'來獲取self.counter.stop()來停止while循環。

+1

您是否意識到* start *函數內的'while'循環是部分無限的事實? – nbro

+0

也許需要第二個線程來做到這一點。 – Marcin

+0

「外部停止」 - 你的意思是來自另一個進程還是同一進程內? – cdarke

回答

3

如果你想要做的並行東西,你必須使用線程或多個進程是這樣​​的:

import threading 

from time import sleep 


class Counter(object): 

    def __init__(self): 
     self.number = 0 
     self.running = False 

    def start(self): 
     self.running = True 
     while self.running: 
      self.number += 1 
      # add sleep to prevent blocking main thread by this loop 
      sleep(0.1) 

    def status(self): 
     return self.number 

    def stop(self): 
     self.running = False 


class Cmd(object): 
    t = None 
    counter = None 

    def start(self): 
     self.counter = Counter() 
     self.t = threading.Thread(target=self.counter.start) 
     self.t.start() 

    def do_status(self): 
     return self.counter.status() 

    def stop(self): 
     self.counter.stop() 
     # waiting while thread with Counter will finish 
     self.t.join() 


if __name__ == "__main__": 
    cmd = Cmd() 
    print "Starting counter" 
    cmd.start() 
    sleep(5) 
    print cmd.do_status() 
    sleep(2) 
    print cmd.do_status() 
    cmd.stop() 
    print "Counter was stopped" 

輸出將是:

Starting counter 
50 
70 
Counter was stopped 

但是,如果你希望能夠與計數器溝通從不同的應用程序,那麼你必須瞭解sockets

+0

謝謝!線程和睡眠完美地解決了這個問題! –

0

如果cmdCmd一個實例,並使用實例方法您:

發送實例Counter

def __init__(self, cmd): 
    self.number = 0 
    # self.running = False # removed - use self.cmd.status() for control 
    self.cmd = cmd 

控制while使用self.cmd

def start(): 
    while self.cmd.status(): 
     self.number += 1 

我預計self.cmd.status()被阻止(期待用戶輸入,或類似的東西)。