多進程 python中創建進程模塊為: 進程之間數據不是共用的 註意:windowns下進程運行會報錯,linux mac 不會出現此問題。解決方法: 將進程啟動代碼放到main里即可執行,示例代碼: 進程常用方法: :和線程一樣,預設會等子進程執行完畢後,代碼才會繼續往下執行 : True 為 主 ...
多進程
python中創建進程模塊為:multiprocessing
進程之間數據不是共用的
註意:windowns下進程運行會報錯,linux mac 不會出現此問題。解決方法:
將進程啟動代碼放到main里即可執行,示例代碼:
import multiprocessing
def task(arg):
print(arg)
def run():
for i in range(10):
# 實例化一個進程
process = multiprocessing.Process(target=task,args=(i,))
# 進程啟動
process.start()
if __name__ == '__main__':
run() # main下才能正確執行,不然會報錯
進程常用方法:
join()
:和線程一樣,預設會等子進程執行完畢後,代碼才會繼續往下執行daemon
:- True 為 主進程執行完代碼,程式會直接結束,不會等待子進程執行完畢
- False為:主進程執行完畢後,會等待子進程執行完畢
name
:為進程起一個名稱multiprocessing.current_process()
:獲取當前進程ident/pid
:獲取當前進程的ID號
示例代碼:
import time
import multiprocessing
def task(arg):
p = multiprocessing.current_process() # 獲取當前進程
print(p.name) # 列印當前進程名稱
print(p.ident) # 獲取當前進程的ID號
print(p.pid) # 獲取當前進程的ID號
time.sleep(2)
print(arg)
def run():
print('11111111')
#### 進程一
process1 = multiprocessing.Process(target=task,args=(1,))
# False 主進程執行完畢後,會等待子進程執行完畢
# True 為不等待子進程執行完畢,主進程執行完畢後,程式就會結束
process1.daemon = False
# 為當前進程起一個名稱
process1.name = 'proc1'
process1.start()
# 預設會等進程執行完畢後,代碼才會繼續往下執行
process1.join()
print('22222222')
#### 進程二
process2 = multiprocessing.Process(target=task, args=(2,))
process2.daemon = False
process2.name = 'proc2'
process2.start()
process2.join()
print('33333333')
if __name__ == '__main__':
run()
類繼承方式創建進程(示例代碼如下:)
##################### 類繼承方式創建進程 #####################
import multiprocessing
class MyProcess(multiprocessing.Process):
def run(self):
print('當前進程', multiprocessing.current_process())
def run():
t1 = MyProcess()
t1.start()
t2 = MyProcess()
t2.start()
if __name__ == '__main__':
run()
進程之間的數據共用
multiprocessing.Queue(列表數據共用)
windows下執行數據共用有點問題,所以使用下麵方法可以解決
- 示例代碼:
##################### 進程之間的數據共用 multiprocessing.Queue #####################
import multiprocessing
q = multiprocessing.Queue() # 數據共用可以使用的隊列
def task(arg,q):
q.put(arg)
def run():
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,q))
proc.start()
while True:
v = q.get()
print(v)
if __name__ == '__main__':
run()
multiprocessing.Manger(字典數據共用)
linux mac下可以正常執行
示例代碼:
import multiprocessing
m = multiprocessing.Manager()
dic = m.dict()
def task(arg):
dic[arg] = 100
def run():
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,))
proc.start()
input('>>>')
print(dic.values())
if __name__ == '__main__':
run()
windowns:
- 第一種方法
import multiprocessing
def task(arg,dic):
dic[arg] = 100
if __name__ == '__main__':
m = multiprocessing.Manager()
dic = m.dict()
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,dic))
proc.start()
proc.join() # 一個一個進程等待,執行完了,再執行下一個
print(dic)
- 第二種方法(linux也適用)
import time
import multiprocessing
def task(arg,dic):
time.sleep(2)
dic[arg] = 100
if __name__ == '__main__':
m = multiprocessing.Manager()
dic = m.dict()
process_list = []
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,dic))
proc.start()
process_list.append(proc)
while True:
count = 0
for p in process_list:
if not p.is_alive():
count += 1
if count == len(process_list):
break
print(dic)
進程鎖
概念:不管線程還是進程,鎖都是一樣的
什麼時候用鎖: 只有進程或線程操作同一個數據的時候才會進行加鎖,如果各自做各自的是不需要加鎖的
具體意義看多線程里的鎖機制,和進程一樣
多線程鎖:https://www.cnblogs.com/Hybb/p/11512011.html
鎖的方法
Lock
(一次放行一個)RLock
遞歸鎖(一次放行多個)BoundedSemaphore
(一次放N個) 信號量Condition
(1次放x個數)動態輸入Event
(事件)1次放所有
示例代碼
import time
import multiprocessing
lock = multiprocessing.Lock()
lock = multiprocessing.RLock()
lock = multiprocessing.BoundedSemaphore()
lock = multiprocessing.Condition()
lock = multiprocessing.Event()
def task(arg):
print('開始了')
lock.acquire()
time.sleep(2)
print(arg)
lock.release()
def run():
for num in range(1,3):
proc = multiprocessing.Process(target=task,args=(num,))
proc.start()
if __name__ == '__main__':
run()
進程池
使用的模塊 concurrent.futures
和線程池是一樣的
示例代碼:
import time
# 導入進程池模塊
from concurrent.futures import ProcessPoolExecutor
def task(arg):
time.sleep(2)
print(arg)
if __name__ == '__main__':
# 創建一個進程池
pool = ProcessPoolExecutor(5)
for num in range(10):
pool.submit(task,num)