0%

Python-Simple-parallel

Python - multiprocessing

大部分程式都是由上到下依序執行,若一個程式花費需要5秒,批示執行8次,理論是應該須40秒時間。現在CPU都是多核心,假設有一個8 core的CPU,將執行8次花費5秒的程式,分配到每個核心並行執行,理論上應該只要5秒就可完成工作。Python 標準函式庫 就有 multiprocessing 可達到此目的。

Python Demo 1

1.ping 5次 (循序方式,於雙核CPU) ;測出約8秒

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python                                                                                                                 
import os

def job1(url):
tmpstr="ping -c 5 "+str(url)
os.system(tmpstr)

if __name__=='__main__':
job1("8.8.8.8")
job1("8.8.4.4")

2.ping 5次 (並行方式,於雙核CPU);測出約4秒

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python                                                                                                                 
import multiprocessing as mp
import os

def job1(url):
tmpstr="ping -c 5 "+str(url)
os.system(tmpstr)

if __name__=='__main__':
p1=mp.Process(target=job1,args=("8.8.8.8",))
p1.start()
p2=mp.Process(target=job1,args=("8.8.4.4",))
p2.start()

Python Demo 2 ,另一種Pool寫法

1.一個工作睡3秒,執行5次。(循序方式,於雙核CPU) ;測出約15秒

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python                                                                                                                 
from multiprocessing import Pool
from time import sleep

def task(argss):
print(str(argss) +" start ... sleep")
sleep(3)

if __name__ == '__main__':
for i in range(5):
task(i)

2.一個工作睡3秒,執行5次。(並行方式,於雙核CPU) ;測出約9秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
from multiprocessing import Pool
from time import sleep

def task(argss):
print(str(argss) +" start ... sleep")
sleep(3)

if __name__ == '__main__':
p=Pool(2)
for i in range(5):
p.apply_async(task, args=(i,))

print('Waiting for all subprocesses..')
p.close()
p.join()
print('All Subprocess done ..')

參考資料

歡迎關注我的其它發布渠道