2017-03-24 106 views
0

是否可以通過變量變量設置循環?我正在使用線程,並且變量可以在兩行之間經常更改。變量變化的實時檢測

我正在尋找這樣的事情:

length = len(some_list) 
while length == len(some_list): 
    if check_something(some_list): 
     # The variable could change right here for 
     # example, and the next line would still be called. 
     do_something(some_list) 

到目前爲止,我沒有運氣,這是不是在Python的可能嗎?

編輯:更多我正在尋找的東西,以便循環重新啓動,如果some_list更改。

+0

有人會來的,並提出一個隊列,我要崩潰,因爲我打我的頭撞牆試圖讓與等待值進度條同時返回一個值線程要退回TT – Charlie

+1

隊列如何? – tdelaney

+1

你試過了一個隊列嗎? – Eric

回答

2

如果它只是一個更改列表,您可以製作本地副本。

def my_worker(): 
    my_list = some_list[:] 
    if check_something(my_list): 
     do_something(my_list) 

UPDATE

隊列可以爲你工作。修改的東西需要發佈到隊列中,所以它不是自動的。如果內存被隊列耗盡,後臺線程也會落後並處理舊的東西,或者最終導致崩潰。

import threading 
import queue 
import time 

def worker(work_q): 
    while True: 
     some_list = work_q.get() 
     if some_list is None: 
      print('exiting') 
      return 
     print(some_list) 

work_q = queue.Queue() 
work_thread = threading.Thread(target=worker, args=(work_q,)) 
work_thread.start() 

for i in range(10): 
    some_list.append(i) 
    work_q.put(some_list[:]) 
    time.sleep(.2) 
work_q.put(None) 

work_thread.join() 
+0

那麼,我需要的是它有實時更新,所以如果變量改變,那麼它會重新啓動循環。我將編輯我的帖子。 –

+0

如果列表正在寫入而您複製它,它不會拋出? – Eric

+0

@Eric - 在複製期間python不會釋放GIL,所以它的線程安全。如果我正在做一些循環附加操作,情況會有所不同。 – tdelaney