2011-06-12 62 views
2
from threading import Thread 
import time 
print 'start of script' 

class MyThread(Thread): 
    def __init__(self, start, end): 
     self.start = start 
     self.end = end 
    def run(self): 
     for i in xrange(self.start,self.end): 
      yield i 




my_threads = [] 

my_thread = MyThread(1,6) 
my_thread.start() 
my_threads.append(my_thread) 

my_thread = MyThread(6,11) 
my_thread.start() 
my_threads.append(my_thread) 

my_thread = MyThread(11,16) 
my_thread.start() 
my_threads.append(my_thread) 


for t in my_threads: 
    print t.join() 

print 'end of script' 

如何正確執行此操作? 我試圖打印的數字:範圍(1,16),其中我從一個函數的輸出得到這個數字運行在一個單獨的線程。從線程收益項目

我明白,我不會得到這個範圍數字按順序排列,就像在單獨的線程中運行的函數的性質一樣

我也知道我可以簡單地在線程的函數本身中打印它們,但那不是重點,我想打印我已經輸出的東西在我的代碼的主線程或主要部分。

回答

0

我認爲你要找的是一個Queue。將一個隊列傳遞到你的線程,然後不是產生值,而是將它們放入隊列中myqueue.put(i))。然後你可以在主線程中獲得它們(myqueue.get())。

4

線程不會返回值,所以您將無法按照您的希望將值返回給主線程。如果你想讓你的腳本運行(你需要將你的start變量的名稱改爲別的,因爲你隱藏了start方法),你會發現t.join()的返回值是None。解決此問題的常見方法是使用一個隊列,在這個類似的問題被提出:Return value from thread

在你的情況,而不是調用yield i我會打電話queue.put(i)其中queue是在Queue.Queue建設過程中傳遞的,然後有一個循環投擲Empty並打破while循環的前

while True: 
    try: 
     print outqueue.get(True, 1) 
    except Empty: 
     break 

for t in my_threads: 
    print t.join() 

這將等待1秒一個新項目:在主線程之前,我加入了我的線程。

+0

它的工作..然而,我想使用YIELD的原因是遠離大變量,所以我想保持q = Queue.Queue(2),然後我做q.get(真),但它滯後和從不打印?我怎樣才能讓隊列一次只保留2個項目,並且仍能獲得我想要的所有值? – MistahX 2011-06-12 23:03:23

+0

那麼'q.get(True)'會永遠阻塞,所以當你的發生器完成時,沒有任何東西會被打印出來,它會永遠坐着。同樣用'q = Queue.Queue(2)'初始化'q'將限制你的'Queue'爲2個對象,你的'q.put(i)'調用阻塞直到有空間。我不確定你在問什麼,但另一種實現它的方式是在隊列上永遠保留'Queue'塊,但是放一些東西表明你的生產者已經完成了'Queue'並且擁有當看到所有生產者完成時,主線程跳出while循環。 – Hoons 2011-06-13 16:36:02