2014-12-31 3 views
1

У меня есть интерпретатор командной строки класса cmd.Cmd, который, например, инициализирует self.counter = Counter().Внешняя остановка работы во время цикла

После вызова «start» do_start() вызовет self.counter.start(), а self.counter запустит цикл while, который отсчитывает от 0 до бесконечности.

ПСЕВДОКОД пример счетчика:

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(), который даст ток число, которое было увеличено?

И как я могу называть «stop» в моем классе cmd.Cmd, чтобы получить self.counter.stop(), чтобы остановить цикл while.

+1

Знаете ли вы, что цикл 'while' внутри функции * start * является частичным бесконечным? – 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

Спасибо! Threading и sleep отлично справились с проблемой! –

0

если cmd является экземпляром Cmd и вы используете метод экземпляра:

Отправить экземпляр для 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 

I ожидайте self.cmd.status() для блокировки (ожидая ввода пользователем или что-то в этом роде).

Смежные вопросы