2 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
由于您使用的是多處理而不是多線程,因此您的性能問(wèn)題與 GIL(Python 的全局解釋器鎖)無(wú)關(guān)。
我找到了一個(gè)有趣的鏈接,用一個(gè)例子解釋了這一點(diǎn),你可以在這個(gè)答案的底部找到它。
GIL 不會(huì)阻止進(jìn)程在機(jī)器的不同處理器上運(yùn)行。它只允許一個(gè)線程在解釋器中一次運(yùn)行。
所以多處理而不是多線程將使您實(shí)現(xiàn)真正的并發(fā)。
讓我們通過(guò)一些基準(zhǔn)測(cè)試來(lái)理解這一切,因?yàn)橹挥羞@樣才能讓您相信上面所說(shuō)的。是的,這應(yīng)該是學(xué)習(xí)的方式——體驗(yàn)它而不是僅僅閱讀或理解它。因?yàn)槿绻憬?jīng)歷過(guò)一些事情,再多的爭(zhēng)論也無(wú)法說(shuō)服你接受相反的想法。
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()
附加信息
在這里您可以找到此信息的來(lái)源和更詳細(xì)的技術(shù)說(shuō)明(獎(jiǎng)勵(lì):其中還引用了 Guido Van Rossum :))

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
您正在使用pool.apply
哪個(gè)正在阻塞。pool.apply_async
改為使用,然后函數(shù)調(diào)用將全部并行運(yùn)行,并且每個(gè)調(diào)用都會(huì)AsyncResult
立即返回一個(gè)對(duì)象。您可以使用此對(duì)象來(lái)檢查進(jìn)程何時(shí)完成,然后也可以使用此對(duì)象檢索結(jié)果。
添加回答
舉報(bào)