2014-02-24 5 views
0

모범 사례인지 모르겠지만 목록에있는 매개 변수를 확인하는 매 5 초마다 활성화되는 스레드가 있습니다. 루프는 while 루프 외부에서 함수를 사용하여 매개 변수를 목록에 삽입합니다 (이 부분은 정상적으로 작동 함). 그러나 목록은 스레드 내부에서 업데이트되지 않습니다. 어떻게 스레드로 보내겠습니까?파이썬 3.3 - 변수를 스레드로 보내기

IE

def addtolist(): 
    mylist.extend([variable]) 

def myfunction(): 
    while True: 
     if time.time() > 5 + last_time: 
      last_time = time.time() 
      print(mylist[0]) # doesn't print anything 
     time.sleep(1) 

if __name__ == "__main__": 
    count_job = Thread(target = myfunction, args =()) 
    count_job.start() 

while True: 
    variable = "Look, a fly!" 
    addtolist() 
    time.sleep(7) 

나는 그것이보다 아주 조금 더 복잡하고 여기에 붙여 너무 길다하지만 난 그냥 그 작동하지 않는 추가 한 부분이다 말은, 무엇이다 잘못하고있는거야?

답변

2

스레드 기능이 즉시 종료됩니다 ... 시간을 한 번만 확인하고 초기 값 last_time에 따라 mylist의 첫 번째 요소를 인쇄하고 종료합니다.

def myfunction(): 
    while True: # loop forever 
     if time.time() > 5 + last_time: 
      last_time = time.time() 
      print(mylist[0]) # doesn't print anything 
     time.sleep(1) # wait for one second for mylist to be updated, yield to main thread 

참고가에 sleep를 추가하지 않는 경우 : 귀하의 예제 코드는 변수가 초기화되는 경우 방법/표시되지 않는다는 사실에서 제외

는 스레드 기능은 다음과 같을 필요 쓰레드라면, 메인 쓰레드로 제어권을 반환하지 않고 (그리고 많은 양의 CPU를 소비하지 않고) 바쁜 루프에서 기다릴 것이다.

또한 스레드는 항상 동일한 값 (mylist의 첫 번째 요소)을 인쇄합니다. addtolist이 목록의 끝에 추가되므로 새 값이 표시되지 않습니다. print(mylist[0])print(mylist[-1])으로 변경하여 마지막으로 삽입 된 요소를 표시 할 수 있습니다.

마지막으로,이를 수행하는 훨씬 더 좋은 방법이 있습니다. 섹션 아래의 docs.python.org/3.3/library/threading.html을 참조하십시오. 조건 오브젝트.

+0

Timers Objects이 이미 잠시 진정한 루프를 않는 스레드를 추가하는 것을 잊었다 사용 고려해야 업데이트됩니다 내 게시물, 내 실수 – sunshinekitty

+0

다음에는 바쁜 루프에 있습니다 ... 내 대답과 같이 'sleep' 문을 추가하고 결과가 다른지 확인해보십시오. – isedev

+0

내 루프에 time.sleep (1)이 있습니다. 한숨을 더 드리겠습니다. – sunshinekitty

1

어떤 상태가있는 스레드를 구현하기위한 다른 방법을 권장합니다. 전역 변수를 사용하지 말고 대신 threading.Thread 상속을 사용하십시오.

import threading 
import time 


class MyThread(threading.Thread): 

    def __init__(self, some_list=None): 
     super(MyThread, self).__init__() 
     self.list = some_list if some_list is not None else [] 
     self.event = threading.Event()  # Used for stop the thread 

    def run(self): 
     while not self.event.isSet(): 
      # Do your thread thing here. 
      time.sleep(1) 
      print(self.list) 


    def add_elem(self, elem): 
     self.list.append(elem) # Extend or append, is up to you. 

    def stop(self): 
     self.event.set() 


if __name__ == '__main__': 

    thread = MyThread()  # Thread instance. 
    thread.start()   # Start the thread. 
    thread.add_elem(10)  # Add some element. 
    time.sleep(3)   # Wait 3 secs. 
    thread.add_elem(100) # Add another element. 
    time.sleep(3)   # Wait 3 secs. 
    thread.stop()   # Stop thread. 

당신도 스레드에 더 많은 "행동"을 추가 할 수 있습니다이 방법, 당신은 ... 등, sort, remove 같은

을 기능을 추가 할 수 있습니다 :

는 예를 들어, 문제는 이런 식으로 해결 될 수있다 당신이 (당신의 경우 5 초)를 시간이지나 실행 얻을 작업을 실행하는 경우 반면에

, 당신은