2014-09-08 3 views
0

У меня есть следующий код в Python:Брус назначить нить локальной переменной

class gateWay: 
    def __init__(self): 
     self.var1 = [] 
     self.var2 = {} 
     self.currentThread = None 

    def stateProcess(self, file): 
    # some irrelevant code 
    self.currentThread = saltGatWayThread(self, file).start() 
    return self.var1 

    def stopRunning(self): 
     self.currentThread.proc.stop() 

Кроме того, здесь исходный код saltGatWayThread:

class saltGatWayThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     # some irrelevant code 
     self.proc = src.proc.Process1() 

Кроме того, я следующий код в src/proc/__init__.py:

class Process1: 
    def stop(self): 
      # code to stop operation 

в консоли, я замечаю, что self.currentThread является недействительным.

Моя цель - сохранить поток в локальной переменной при запуске. Если я получаю запрос на прерывание, я применяю функцию stopRunning. Эта функция берет сохраненный поток и выполняет «чистый» выход (завершает процесс протектора и выхода).

Почему я не могу сохранить нить и использовать ее структуру позже?

+0

Вы уверены, что' stateProcess' бежится – Kevin

+0

@Kevin.?: Да, я запускаю stateProcess и сразу после запуска stopRunning –

+0

Итак, вы запускаете 'stopRunning' сначала, а затем запускаете' stateProcess' после этого? Но тогда 'self.currentThread.proc.stop()' должен поднять 'AttributeError: 'NoneType' объект не имеет атрибута 'proc'', поскольку' currentThread' еще не инициализирован. Это то, что вы видите? – Kevin

ответ

1

invoke currentThread = saltGatWayThread(), а затем вызывает .start(). currentThread не содержит экземпляр потока, потому что метод starts() всегда возвращает ничего в соответствии с исходным кодом threading.py. См источник C: \ python27 \ Lib \ threading.py Защиту начать (Я): "" "Начало деятельности потока

It must be called at most once per thread object. It arranges for the 
    object's run() method to be invoked in a separate thread of control. 

    This method will raise a RuntimeError if called more than once on the 
    same thread object. 

    """ 
    if not self.__initialized: 
     raise RuntimeError("thread.__init__() not called") 
    if self.__started.is_set(): 
     raise RuntimeError("threads can only be started once") 
    if __debug__: 
     self._note("%s.start(): starting thread", self) 
    with _active_limbo_lock: 
     _limbo[self] = self 
    try: 
     _start_new_thread(self.__bootstrap,()) 
    except Exception: 
     with _active_limbo_lock: 
      del _limbo[self] 
     raise 
    self.__started.wait() 
Смежные вопросы