ä¼æå¨ç¥ï¼ç±äºpythonï¼Cpythonï¼çå
¨å±éï¼GILï¼é®é¢åå¨ï¼å¯¼è´Threadä¹å°±æ¯çº¿ç¨ç并è¡å¹¶ä¸å¯å®ç°ã multiprocessing 模åéç¨å¤è¿ç¨èä¸æ¯å¤çº¿ç¨çæ¹å¼å®ç°å¹¶è¡ï¼è§£å³äºGILçé®é¢ï¼ä¸å®ç¨åº¦ä¸ä½¿ç¶åµå¾å°äºç¼è§£ã
ç¶èï¼Multiprocessæ¬èº«ä¾ç¶æä¸äºåè½ä¸çç¶é¢ãå
¶ä¸ä¸ä¸ªéè¦çæ¯ï¼è¿ç¨ä¹é´ä¸è½å
±äº«å
åï¼çº¿ç¨é´åå¯ä»¥å
±äº«å
åï¼ãè¿æå³çå¨è¿ç¨é´äº¤æ¢æ°æ®çæ¶åï¼éè¦ææ°æ®æå
ãä¼ éï¼è§£å
ãå¨pythonçè¯å¢ä¸å°±æ¯ï¼
"pickle from main process to the subprocess;
depickle from subprocess to an object in memory;
pickle and return to the main process;
depickle from main process and return to memory"
(å
·ä½è¯¦è§è¿ä¸ªé®é¢ä¸çå槽)
å æ¤ï¼ å¨éè¦å¨è¿ç¨é´å
±äº«å·¨å¤§çæ°æ®å
çæ¶åï¼å¤è¿ç¨ç表ç°è¿ä¸å¦åè¿ç¨ã
é¤æ¤ä¹å¤ï¼å½éè¦è¿è¡çç¨åºæ¬èº«ä¸æ¯è®¡ç®å¯éåèæ¯æ¯IOå¯éåï¼å¤è¿ç¨æå¢å ç读åä¼æµæ¶æè¿ç®é度çå¢çï¼å¦æç¨åºå¤æåº¦æ ¹æ¬ä¸éè¦ç¨å¹¶è¡æ¥è§£å³ï¼é£ä¹å»ºç«è¿ç¨ï¼æ± ï¼çæ¶é´å¾å¯è½æ¯è¿è¡ç¨åºæ¬èº«è¿è¦æ
¢ï¼å¦å¤ï¼å¨è¿ç¨æ± multiprocessing.Pool(n) ç n çéæ©ä¸ï¼å¦æéæ©äºå¤äºå½åCPUçæ ¸å¿æ°ç®çæ°åï¼ multiprocessing.cpu_count() ï¼ï¼é£ä¹å¨è¿ç¨ä¹é´åæ¢çå夫ä¼å¤§å¤§æä½æçã
建ç«å¯¹çº¿ç¨åè¿ç¨å
³ç³»çç´è§å°è±¡ï¼å¯åèè¿ç¯æç« ã
å¿«éèå®æ´å°äºè§£pythonçå
¨å±éï¼GILï¼é®é¢ï¼åèè¿ç¯ä¸éçå客ã
为äºè§£ multiprocess ç使ç¨ï¼æåäºä¸äºæµè¯ï¼æµè¯ç¯å¢æ¯4æ ¸çMacbook Airãå¦ä¸ï¼
from multiprocessing import Process, Manager, Pool
1 def f(l):
2 l.reverse()
3
return
4
5 def main():
6
l1 = [random.randrange(0, 100000, 1) for i in range(0, 100000)]
7
l2 = [random.randrange(0, 100000, 1) for i in range(0, 100000)]
8
l3 = [random.randrange(0, 100000, 1) for i in range(0, 100000)]
9
l4 = [random.randrange(0, 100000, 1) for i in range(0, 100000)]
10
l5 = [random.randrange(0, 100000, 1) for i in range(0, 100000)]
11
l6 = [random.randrange(0, 100000, 1) for i in range(0, 100000)]
12
l7 = [random.randrange(0, 100000, 1) for i in range(0, 100000)]
13
s = time.time()
14
for l in [l1, l2, l3, l4, l5, l6, l7]:
15
f(l)
16
print "%s seconds" % (time.time() - s)
17
s = time.time()
18 map(f, [l1, l2, l3, l4, l5, l6, l7])
19
print "%s seconds" % (time.time() - s)
20
p = Pool(4)
21
s = time.time()
22 p.map(f, [l1, l2, l3, l4, l5, l6, l7])
23
print "%s seconds" % (time.time() - s)
24
return
ä¹å°±æ¯åå«æµè¯ f() 对 l1, l2, l3, l4, l5, l6, l7 7个å表çæä½æ¶é´ãå
æ¯å¾ªç¯çä¾æ¬¡æä½ï¼åæ¯pythonä¸é常好ç¨ç map() å½æ°ï¼æåæ¯ multiprocessing çè¿ç¨æ± multiprocessing.Pool.map() ââè¿ç¨æ± ä¸å»ºç«äº4个 worker process , ä¹å°±æ¯è¯´ï¼æ¥ä¸æ¥çä»»å¡ä¼è¢«éæºå°åé
ç»4个è¿ç¨æ¥å®æã
æ¯æ¬¡æä½ä¹åé½éæ°è®¡æ¶ï¼å¾å°äºè¿æ ·çç»æï¼
>>> main()
0.00250101089478 seconds
0.000663995742798 seconds
0.907639980316 seconds
å¤è¿ç¨åºå¥å¾æ
¢ãè map() ç¸å¯¹äºå¾ªç¯æä½æå¾å¤§çæçæåã
温馨提示:答案为网友推荐,仅供参考