因爲GIL
的存在,Python中的多線程其實並非真正的多線程,若是想要充分地使用多核CPU
的資源,在Python中大部分狀況須要使用多進程。Python提供了很是好用的多進程模塊multiprocessing
,只須要定義一個函數,Python會完成其餘全部事情。藉助這個模塊,能夠輕鬆完成從單進程到併發執行的轉換。multiprocessing
支持子進程、通訊和共享數據、執行不一樣形式的同步,提供了Process
、Lock
、Queue
、Pipe
等組件。python
multiprocessing
模塊是Python中的多進程模塊。與threading.Thread
相似,它能夠利用multiprocessing.Process
對象來建立一個進程。該進程能夠運行在Python程序內部編寫的函數。該Process對象與Thread對象的用法相同,也有start()
,run(),
join()
的方法。此外multiprocessing
模塊中也有Lock
/Event
/Semaphore
/Condition
類 (這些對象能夠像多線程那樣,經過參數傳遞給各個進程),用以同步進程,其用法與threading
模塊中的同名類一致。因此,multiprocessing
的很大一部份與threading
使用同一套API,只不過換到了多進程的情境。 固然多進程的定義方式也和多線程相似,即兩種方式:多線程
# 導入多進程模塊
from multiprocessing import Process
# os.getpid() 獲取當前進程的id
import os
def run_proc(name):
print('{} child process is {}'.format(name, os.getpid()))
if __name__ == '__main__':
print("Parent process is {}".format(os.getpid()))
p = Process(target=run_proc, args=('test', ))
print('child process will start...')
p.start()
p.join()
print('child process end.')
複製代碼
運行截圖以下: 併發
from multiprocessing import Process
import os
class RunProc(Process):
def __init__(self, name):
Process.__init__(self)
self.name = name
def run(self):
print('{} child process is {}'.format(self.name, os.getpid()))
if __name__ == "__main__":
print("Parent process is {}".format(os.getpid()))
p = RunProc('test')
print('child process will start...')
p.start()
p.join()
print('child process end.')
複製代碼
運行結果以下: 函數
實例方法:測試
target
,start
執行默認的· run()
方法。屬性:spa
setDeamon
功能同樣和線程不同的是,進程之間相互獨立,咱們能夠從全局變量的修改窺見一些:線程
from multiprocessing import Process
# 測試數據
ex_list = 'Hello World'
# 修改數據進程
def revise_data():
global ex_list
# 修改全局變量
ex_list = ex_list + ' with write revise_data process.'
print('wirte result:', ex_list)
# 查看數據進程
def view_data():
print(ex_list)
if __name__ == "__main__":
process_revise = Process(target=revise_data)
process_view = Process(target=view_data)
process_revise.start()
# 主進程等待寫入進程執行完成之後代碼 再繼續往下執行
process_revise.join()
process_view.start()
process_view.join()
print("process end.")
複製代碼
運行截圖以下: code