2013-10-07 28 views
1

爲什麼當代碼執行時,結果每次都不一樣?在多線程中獲得不同運行結果

我試圖按照如何執行代碼,我很困惑,我覺得這是沒有意義的。

,結果每次出現隨機

#!/usr/bin/python 

import Queue 
import threading 
import time 

exitFlag = 0 

class myThread (threading.Thread): 
    def __init__(self, threadID, name, q): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.q = q 
    def run(self): 
     print "Starting " + self.name 
     process_data(self.name, self.q) 
     print "Exiting " + self.name 

def process_data(threadName, q): 
    while not exitFlag: 
     queueLock.acquire() 
     if not workQueue.empty(): 
      data = q.get() 
      queueLock.release() 
      print "%s processing %s" % (threadName, data) 
     else: 
      queueLock.release() 
     time.sleep(1) 

threadList = ["Thread-1", "Thread-2", "Thread-3"] 
nameList = ["One", "Two", "Three", "Four", "Five"] 
queueLock = threading.Lock() 
workQueue = Queue.Queue(10) 
threads = [] 
threadID = 1 

# Create new threads 
for tName in threadList: 
    thread = myThread(threadID, tName, workQueue) 
    thread.start() 
    threads.append(thread) 
    threadID += 1 

# Fill the queue 
queueLock.acquire() 
for word in nameList: 
    workQueue.put(word) 
queueLock.release() 

# Wait for queue to empty 
while not workQueue.empty(): 
    pass 

# Notify threads it's time to exit 
exitFlag = 1 

# Wait for all threads to complete 
for t in threads: 
    t.join() 
print "Exiting Main Thread" 

代碼源 http://www.tutorialspoint.com/python/python_multithreading.htm


更新

對不起,我的意思是結果的順序

這樣的:

Starting Thread-1 
Starting Thread-2 
Starting Thread-3 
Thread-3 processing One 
Thread-2 processing Two 
Thread-1 processing Three 
Thread-3 processing Four 
Thread-2 processing Five 
Exiting Thread-1 
Exiting Thread-3 
Exiting Thread-2 
Exiting Main Thread 
[Finished in 3.0s] 

當再試一次,結果

Starting Thread-1 
Starting Thread-2 
Starting Thread-3 
Thread-3 processing One 
Thread-2 processing Two 
Thread-1 processing Three 
Thread-3 processing Four 
Thread-3 processing Five 
Exiting Thread-1 
Exiting Thread-2 
Exiting Thread-3 
Exiting Main Thread 
[Finished in 3.0s] 
+0

您說結果不一樣。結果是什麼?我看不到process_data實際上在做什麼,除了'print'。 –

+0

問題已更新。 – devjustly

+0

唯一的區別是,「五」是由線程3而不是線程2處理的。這不是輸出中的實際差異。哪個線程處理隊列的哪一部分應該不重要。 –

回答

2

我認爲,由 「結果」 你的意思是執行順序。 多線程背後的一個想法是,除非您想明確指定,否則您不必關心執行順序。您完全依賴於底層操作系統,系統負載等。