2011-03-15 2 views
0

2 개의 스레드가있는 파이썬 응용 프로그램이 있습니다. 각 스레드는 별도의 GUI 내에서 작동합니다. GUI는 차단하지 않고 독립적으로 작동해야합니다. thread_1이 thread_2에서 발생하는 이벤트를 트리거하는 방법을 파악하려고합니다.Python 스레딩 질문

다음은 불필요한 리소스를 사용하지 않고도 function foo가 가능한 한 빨리 가장 간단하고 우아한 방법으로 함수 모음을 시작하도록하려는 일부 코드입니다. 아래는 내가 생각해내는 것입니다.

bar_trigger=False #global trigger for function bar. 
lock = threading.Lock() 

class Thread_2(threading.Thread): 
    def run(self): 
    global lock, bar_trigger 
    while(True): 
     lock.acquire() 
     if bar_trigger==True: 
     Thread_2.bar() #function I want to happen 
     bar_trigger=False 
     lock.release() 
     time.sleep(100) #sleep to preserve resources 
         #would like to preserve as much resources as possible 
         # and sleep as little as possible. 

    def bar(self): 
     print "Bar!" 

class Thread_1(threading.Thread): 
    def foo(self): 
     global lock, bar_trigger 
     lock.acquire() 
     bar_trigger=True #trigger for bar in thread2 
     lock.release() 

더 좋은 방법이 있나요? Threading_1 내에서 thread_2의 메서드를 가장 잘 트리거하는 방법에 대한 조언이 있으므로 스레드 전문가는 아닙니다.

+1

여러 스레드에서 GUI 프로그래밍을 지원하는 GUI 프레임 워크에 대해 잘 모릅니다. 어떤 프레임 워크를 사용하고 있습니까? –

답변

0

이러한 스레드는 어떻게 인스턴스화됩니까? 실제로 노동자들을 감독하는 주요 실이 있어야합니다. 예를 들어, 이벤트 객체를 공유 사용

import time 
import threading 

class Worker(threading.Thread): 
    def __init__(self, stopper): 
     threading.Thread.__init__(self) 
     self.stopper = stopper 

    def run(self): 
     while not self.stopper.is_set(): 
      print 'Hello from Worker!' 
      time.sleep(1) 

stop = threading.Event() 
worker = Worker(stop) 
worker.start() 

# ... 

stop.set() 

는 동기화 및 스레드간에 메시지를 보내는 하나의 방법입니다. 다른 것들도 있으며 그 사용법은 세부 사항에 달려 있습니다.

0

하나의 옵션은 스레드간에 큐를 공유하는 것입니다. 스레드 1은 명령을 큐에 넣고 스레드 2는 해당 큐를 폴링합니다. 스레드 2가 대기열이 비어 있지 않다고 판단하면 대기열의 첫 번째 명령어를 읽고 해당 함수를 호출합니다. 이것은 상당히 느슨하게 커플이된다는 추가적인 이점을 가지고있어서 각 스레드를 쉽게 테스트 할 수 있습니다.

1

당신이 무슨 일을하는지 당신이 사용중인 GUI 프레임 워크 모른 채, 나는 훨씬 더 자세히 얻을 수 있지만, conditional variables라는 뭔가를 찾고있는 것처럼 문제의 코드 조각에서, 그것은 소리 .

파이썬은 기본적으로 스레딩 모듈에 포함되어 있으며, threading.Condition에 속합니다. threading.Event에도 관심이있을 수 있습니다.