1

我發現線程模塊比同一個任務需要更多的時間。試用線程和多處理模塊,python

import time 
import threading 
import multiprocessing 

def func(): 
    result = 0 
    for i in xrange(10**8): 
     result += i 

num_jobs = 10 


# 1. measure, how long it takes 10 consistent func() executions 
t = time.time() 
for _ in xrange(num_jobs): 
    func() 
print ("10 consistent func executions takes:\n{:.2f} seconds\n".format(time.time() - t))   

# 2. threading module, 10 jobs 
jobs = [] 
for _ in xrange(num_jobs): 
    jobs.append(threading.Thread(target = func, args=())) 
t = time.time() 
for job in jobs: 
    job.start() 
for job in jobs: 
    job.join()  
print ("10 func executions in parallel (threading module) takes:\n{:.2f} seconds\n".format(time.time() - t))   

# 3. multiprocessing module, 10 jobs 
jobs = [] 
for _ in xrange(num_jobs): 
    jobs.append(multiprocessing.Process(target = func, args=())) 
t = time.time() 
for job in jobs: 
    job.start() 
for job in jobs: 
    job.join() 
print ("10 func executions in parallel (multiprocessing module) takes:\n{:.2f} seconds\n".format(time.time() - t)) 

結果:

10個一致FUNC處決需要:在平行 25.66 seconds

10 FUNC處決(穿線模塊)需要: 46.00 seconds

10 FUNC執行並行(多處理模塊)需要: 7.92 seconds

1)爲什麼用多處理模塊的實施工作比線程模塊更好?

2)爲什麼一致 FUNC處決花費較少的時間,然後使用線程模塊?

+0

@AnthonySottile,謝謝,但我的問題是更廣泛的你的鏈接的問題 –

+2

這真的不是 - 這個問題(和幾個答案)詳細說明,線程是(通常)會變得更慢(對於CPU綁定操作),因爲全局解釋器鎖定,並且多處理和線程都將有一些啓動成本。在這種情況下線程的原因是如此之慢是由於GIL和上下文切換。 –

回答

2

您的兩個問題可以通過這個摘自docs回答:

由CPython的解釋中所使用的機制,以確保只有一個線程同時執行Python的字節碼這簡化了。 CPython實現通過使對象模型(包括像dict這樣的關鍵內置類型)隱式地避免併發訪問。鎖定整個解釋器使得解釋器更易於多線程化,但犧牲了大部分的並行性通過多處理器機器。

大膽強調我的。你最終花了很多時間在線程之間切換,以確保它們全部運行完成。這就像將一根繩子切成小塊,然後再將其捆綁在一起,每次一根繩子。

由於每個進程都在其自己的地址空間中執行,所以使用多處理模塊的結果與預期一致。這些過程彼此獨立,除了處於同一個過程組並具有相同的父過程之外。