2014-02-24 48 views
0

我不確定這是最佳實踐還是其他任何操作,但我有一個線程正在運行,每5秒鐘激活一次檢查列表中的參數,在該線程之外我有一段時間循環運行,它會使用while循環之外的函數(這部分工作正常)插入參數到列表中,但是列表並沒有在線程內部更新,我將如何將它發送到線程?Python 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

您的線程函數立即退出......它執行一次時間檢查,打印第一個元素mylist,具體取決於初始值last_time並退出。

的事實,您的示例代碼不說明如何/那裏的變量初始化

除此之外,你的線程函數必須是這個樣子:

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,根據部分17.1.5。條件對象

+0

忘了添加線程確實有,而真正的循環已經在這,將更新我的帖子,我的錯誤 – 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. 

這種方式,您甚至可以添加更多的「行爲」給你的線程,您可以添加功能,如removesort,等...

在另一方面,如果執行該得到(在你的情況下,5秒)過去的一段時間內執行的任務,你應該考慮使用Timers Objects