2014-02-17 5 views
0

Я пытался использовать функцию потока в функции. Но мой терминал говорит, что глобальное имя «thread1» не определено? Есть ли способ реализовать это?Как использовать функцию экземпляра потока внутри функции?

Мой код выглядит так:

import time 
import threading 

count = 0 

class Screen(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.thread_stop = False 

    def run(self): 
     while not self.thread_stop: 
      main() 
    def stop(self): 
     self.thread_stop = True 


def test(): 
    thread1 = Screen() 
    thread1.start() 

def main(): 
    global thread1,count 
    while True: 
     time.sleep(1) 
     count += 1 
     if count >=3: 
      thread1.stop() 
      print "Stop!" 
      break 

test() 
+0

Логика вашего приложения не вещий Архитектура плохо с точки зрения синхронизации. Используйте '' 'Event''' для уведомления потоков о некоторых событиях лучше. –

ответ

0

Вы пропускаете глобальную декларацию thread1 в test функции:

def test(): 
    global thread1 
    ... 

В противном случае, питон лечит thread1 в test в качестве локальной переменной, поэтому в основной thread1 не рассматривается как инициализированный.

Я хотел бы предложить, хотя другой подход (который я нахожу более ясным и безопаснее):

import time 
import threading 

count = 0 

class Screen(threading.Thread): 
    def __init__(self, count): 
     threading.Thread.__init__(self) 
     self.count = count 

    def do_something(self): 
     while True: 
      time.sleep(1) 
      self.count += 1 
      if self.count >=3: 
       print "Stop!" 
       break 

    def run(self): 
     self.do_something() 

def test(): 
    thread1 = Screen(count) 
    thread1.start() 

test() 
+0

Благослови вас! Как я мог это забыть. Я определил этот экземпляр внутри функции !!! – Mario

+0

Использование атрибутов или глобальных переменных для синхронизации потоков - очень плохая практика. –

0

Это лучше использовать другую логику:

from threading import Thread, Event 
import time 

evt_stop = Event() 

def activity(): 
    count = 0 
    while not evt_stop.is_set(): 
     time.sleep(1) 
     count += 1 
     if count >=3: 
      evt_stop.set() 
      print "Stop!" 
     break 


thread = Thread(target=activity) 
thread.start() 
thread.join() 
Смежные вопросы