用Python 多程序程式設計解決python多執行緒程式設計CPU利用率低的問題
之前用python寫了個多執行緒,但發現四核的電腦,CPU利用率卻用了不到30%,後來使用多程序程式設計,四核全開,CPU利用率達到了100%!python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多程序。Python由於全域性鎖GIL的存在,無法享受多執行緒帶來的效能提升。multiprocessing包採用子程序的技術避開了GIL,使用multiprocessing可以進行多程序程式設計提高程式效率。
看到一篇不錯的文章,轉載學習下,原文地址:點我
序. multiprocessing
python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多程序。Python提供了非常好用的多程序包multiprocessing,只需要定義一個函式,Python會完成其他所有事情。藉助這個包,可以輕鬆完成從單程序到併發執行
1. Process
建立程序的類:Process([group [, target [, name [, args [, kwargs]]]]]),target表示呼叫物件,args表示呼叫物件的位置引數元組。kwargs表示呼叫物件的字典。name為別名。group實質上不使用。
方法:is_alive()、join([timeout])、run()、start()、terminate()。其中,Process以start()啟動某個程序。
屬性:authkey、daemon(要通過start()設定)、exitcode(程序在執行時為None、如果為–N,表示被訊號N結束)、name、pid。其中daemon是父程序終止後自動終止,且自己不能產生新程序,必須在start()之前設定。
例1.1:建立函式並將其作為單個程序
import multiprocessing import time def worker(interval): n = 5 while n > 0: print("The time is {0}".format(time.ctime())) time.sleep(interval) n -= 1 if __name__ == "__main__": p = multiprocessing.Process(target = worker, args = (3,)) p.start()print "p.pid:", p.pid print "p.name:", p.name print "p.is_alive:", p.is_alive()
結果
12345678 | p.pid: 8736 p.name: Process -1 p.is_alive: True The time is Tue Apr 21 20: 55: 12 2015 The time is Tue Apr 21 20: 55: 15 2015 The time is Tue Apr 21 20: 55: 18 2015 The time is Tue Apr 21 20: 55: 21 2015 The time is Tue Apr 21 20: 55: 24 2015 |
例1.2:建立函式並將其作為多個程序
import multiprocessing import time def worker_1(interval): print "worker_1" time.sleep(interval) print "end worker_1" def worker_2(interval): print "worker_2" time.sleep(interval) print "end worker_2" def worker_3(interval): print "worker_3" time.sleep(interval) print "end worker_3" if __name__ == "__main__": p1 = multiprocessing.Process(target = worker_1, args = (2,)) p2 = multiprocessing.Process(target = worker_2, args = (3,)) p3 = multiprocessing.Process(target = worker_3, args = (4,)) p1.start() p2.start() p3.start() print("The number of CPU is:" + str(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("child p.name:" + p.name + "\tp.id" + str(p.pid)) print "END!!!!!!!!!!!!!!!!!"
結果
1234567891011 | The number of CPU is: 4 child p.name:Process -3 p.id 7992 child p.name:Process -2 p.id 4204 child p.name:Process -1 p.id 6380 END!!!!!!!!!!!!!!!!! worker_ 1 worker_ 3 worker_ 2 end worker_ 1 end worker_ 2 end worker_ 3 |
例1.3:將程序定義為類
import multiprocessing import time class ClockProcess(multiprocessing.Process): def __init__(self, interval): multiprocessing.Process.__init__(self) self.interval = interval def run(self): n = 5 while n > 0: print("the time is {0}".format(time.ctime())) time.sleep(self.interval) n -= 1 if __name__ == '__main__': p = ClockProcess(3) p.start()
注:程序p呼叫start()時,自動呼叫run()
結果
12345 | the time is Tue Apr 21 20: 31: 30 2015 the time is Tue Apr 21 20: 31: 33 2015 the time is Tue Apr 21 20: 31: 36 2015 the time is Tue Apr 21 20: 31: 39 2015 the time is Tue Apr 21 20: 31: 42
|