2 回答

TA貢獻1824條經驗 獲得超6個贊
由于您使用的是多處理而不是多線程,因此您的性能問題與 GIL(Python 的全局解釋器鎖)無關。
我找到了一個有趣的鏈接,用一個例子解釋了這一點,你可以在這個答案的底部找到它。
GIL 不會阻止進程在機器的不同處理器上運行。它只允許一個線程在解釋器中一次運行。
所以多處理而不是多線程將使您實現真正的并發。
讓我們通過一些基準測試來理解這一切,因為只有這樣才能讓您相信上面所說的。是的,這應該是學習的方式——體驗它而不是僅僅閱讀或理解它。因為如果你經歷過一些事情,再多的爭論也無法說服你接受相反的想法。
import random
from threading import Thread
from multiprocessing import Process
size = 10000000 # Number of random numbers to add to list
threads = 2 # Number of threads to create
my_list = []
for i in xrange(0,threads):
my_list.append([])
def func(count, mylist):
for i in range(count):
mylist.append(random.random())
def multithreaded():
jobs = []
for i in xrange(0, threads):
thread = Thread(target=func,args=(size,my_list[i]))
jobs.append(thread)
# Start the threads
for j in jobs:
j.start()
# Ensure all of the threads have finished
for j in jobs:
j.join()
def simple():
for i in xrange(0, threads):
func(size,my_list[i])
def multiprocessed():
processes = []
for i in xrange(0, threads):
p = Process(target=func,args=(size,my_list[i]))
processes.append(p)
# Start the processes
for p in processes:
p.start()
# Ensure all processes have finished execution
for p in processes:
p.join()
if __name__ == "__main__":
multithreaded()
#simple()
#multiprocessed()
附加信息
在這里您可以找到此信息的來源和更詳細的技術說明(獎勵:其中還引用了 Guido Van Rossum :))

TA貢獻1852條經驗 獲得超1個贊
您正在使用pool.apply
哪個正在阻塞。pool.apply_async
改為使用,然后函數調用將全部并行運行,并且每個調用都會AsyncResult
立即返回一個對象。您可以使用此對象來檢查進程何時完成,然后也可以使用此對象檢索結果。
添加回答
舉報