2013-04-19 3 views
0

메신저마다 새로운 값으로 연속적으로 실행되는 스레드를 업데이트하려고합니다.파이썬 스레딩과 값의 넘겨주기

class Test: 
    def __init__(self, num): 
     #testing reasons 
     self.num = num 

    def printloop(self, num): 
     self.num = num 
     #running is set to True sometime in the beginning 
     while running: 
      print(self.num) 
      time.sleep(3) 
     if not running: 
      print("finished") 
    def setnum(self, num): 
     self.num = num 

내가 이렇게 스레드를 만들 :이 작동하고 적절한 인수를 인쇄

t1 = threading.Thread(target=test.printloop,args=("1")) 

.

하지만 단일 값 스레드를 새 값으로 업데이트하려면 어떻게해야합니까? 모든 스레드를 업데이트해야하는 것은 아닙니다. 모든 스레드에 대한 값을 업데이트 할 것이므로 클래스의 setnum 메소드가 제대로 작동하지 않습니다.

스레드 수명을 제한하고 조인을 완료해야합니다. 그런 다음 새 값으로 다시 작성 하시겠습니까? 또는 각 스레드에 대한 변수를 정의해야합니까? 어떻게 동적으로 수행합니까? 더 좋은 방법이 보이지 않습니까? 감사합니다.

편집 :

test1 = Test(1) 
.. 
test5 = Test(5) 

t1 = threading.Thread(target=test1.printloop,args=("1")) 
t5 = threading.Thread(target=test5.printloop,args=("5")) 

다음 값을 설정하려면 각각의 메소드를 사용 : 나는 내가 좋아하는 것을하게 될 겁니다 가정

?

+0

? 백그라운드에서 끊임없이 계속되는 것? 또는 끝낼 수있는 일이 있습니까? – thkang

+0

계속해서 백그라운드에서 실행하고 싶습니다. 그러나 타이머를 설정하여 새 값으로 다시 실행할 수 있습니다. 내 선호하는 방법은 실행 가능한 경우 실행중인 스레드를 중지하거나 다시 만들지 않고 업데이트하는 것입니다. – Jrc

+0

test1.setnum ('새 값')은 test1.num 만 수정합니다. 당신이 args를 초기화하는 방법에 조심하십시오. args는 튜플이므로 args = ('1',)이어야합니다. printloop은 3 개의 인자 '1', '2', '3'로 호출되기 때문에 args = ('123')은 에러를 던질 것입니다. – sebdelsol

답변

0

단일 정수 값의 경우 Test을 스레드의 서브 클래스로 설정할 수 있습니다. runprintloop으로 호출 할 수 있습니다. 그런 다음 다른 스레드는 setnum라고 안전하게 호출 할 수 있습니다. GIL과 하나의 값을 설정한다는 사실 때문에 안전합니다. 더 복잡한 업데이트를 수행하는 경우 경쟁 조건을 막기 위해 setnum 및 내부 루프를 printloop에 랩핑해야합니다.

편집 : 간단한 예`run`은 무엇입니까

from threading import Thread 
from time import sleep 

class Output(Thread): 

    def __init__(self, num): 
     super(Output, self).__init__() 
     self.num = num 
     self.running = False 

    def run(self): 
     self.running = True 
     while self.running: 
      print self.num 
      sleep(1) 

    def stop(self): 
     self.running = False 

    def set_num(self, num): 
     self.num = num 

output = Output(0) 
output.start() 
sleep(3) 
output.set_num(1) 
sleep(3) 
output.stop() 
output.join() 
+0

AFAIK, int를 설정하는 것은 원자 연산이 아닙니다. 1 바이트보다 길다면 int를 설정하는 도중에 스레드가 인터럽트 될 수 있다는 것을 의미합니다. 그런 다음 스스로 경쟁 조건을 갖게됩니다. –

+0

Python의 GIL은 Python 데이터를 내부적으로 손상시킬 수 없다는 것을 의미하므로 int를 설정하면 전체 int가 설정됩니다. 이것이 저수준 언어에 있다면 위험이 있습니다. – Steve

+0

스티브가 무슨 뜻인지 이해하지 못합니다. 예를 들어 줄 수 있습니까? 다음과 같은 것을하는 것을 의미합니까? threading.Thread.test = Test (123)? – Jrc

관련 문제