Python中的多線程其實并不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數,Python會完成其他所有事情。借助這個包,可以輕松完成從單進程到并發執行的轉換。multiprocessing支持子進程、通信和共享數據、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。
引例:
如之前創建多進程的例子
# -*- coding:utf-8 -*-from multiprocessing import Process,Poolimport os,timedef run_proc(name):    ##定義一個函數用于進程調用  for i in range(5):      time.sleep(0.2)  #休眠0.2秒    print 'Run child process %s (%s)' % (name, os.getpid())#執行一次該函數共需1秒的時間if __name__ =='__main__': #執行主進程  print 'Run the main process (%s).' % (os.getpid())  mainStart = time.time() #記錄主進程開始的時間  p = Pool(8)      #開辟進程池  for i in range(16):                 #開辟14個進程    p.apply_async(run_proc,args=('Process'+str(i),))#每個進程都調用run_proc函數,                            #args表示給該函數傳遞的參數。  print 'Waiting for all subprocesses done ...'  p.close() #關閉進程池  p.join() #等待開辟的所有進程執行完后,主進程才繼續往下執行  print 'All subprocesses done'  mainEnd = time.time() #記錄主進程結束時間  print 'All process ran %0.2f seconds.' % (mainEnd-mainStart) #主進程執行時間運行結果:
Run the main process (36652). Waiting for all subprocesses done … Run child process Process0 (36708)Run child process Process1 (36748)Run child process Process3 (36736) Run child process Process2 (36716) Run child process Process4 (36768)
如第3行的輸出,偶爾會出現這樣不如意的輸入格式,為什么呢? 
原因是多個進程爭用打印輸出資源的結果。前一個進程為來得急輸出換行符,該資源就切換給了另一個進程使用,致使兩個進程輸出在同一行上,而前一個進程的換行符在下一次獲得資源時才打印輸出。
Lock
為了避免這種情況,需在進程進入臨界區(使進程進入臨界資源的那段代碼,稱為臨界區)時加鎖。 
可以向如下這樣添加鎖后看看執行效果:
# -*- coding:utf-8 -*-lock = Lock() #申明一個全局的lock對象def run_proc(name): global lock #引用全局鎖 for i in range(5): time.sleep(0.2) lock.acquire() #申請鎖 print 'Run child process %s (%s)' % (name, os.getpid()) lock.release() #釋放鎖
Semaphore
Semaphore為信號量機制。當共享的資源擁有多個時,可用Semaphore來實現進程同步。其用法和Lock差不多,s = Semaphore(N),每執行一次s.acquire(),該資源的可用個數將減少1,當資源個數已為0時,就進入阻塞;每執行一次s.release(),占用的資源被釋放,該資源的可用個數增加1。
新聞熱點
疑難解答