Process語法結構如下:
Process([group[,target[,name[,args][,kwargs]]]])
target:如果傳遞了函數的引用,可以認為這個子程序就執行這里的代碼
args:給target指定的函數傳遞的參數,已元組的方式傳遞
kwargs:給target指定的函數傳遞命名參數,字典
name:給進程設定一個名字,可以不設定
group:指定進程組,大多數情況用不到
Process創建的實例對象的常用方法:
start():啟動子進程實例(創建子進程)
is_alive():判斷進程子進程是否還在活著
join([timeout]):是否等待子進程執行完畢,或者等待多少秒
terminate:不管任務是否完成,立即終止子進程
Process創建的實例對象的常用屬性:
name:當前進程的別名,默認為Process-N,N為從1開始遞增的整數
pid:當前進程的pid(進程號)ppid(父進程號)
"""
#指定一個全局變量
nums=[1,2,3,4]
deftest():
nums.append(5)
print("--在test中nums=%s"%nums)
time.sleep(3)
deftest2():
print("--在test2中nums=%s"%nums)
defmain():
print("主程序進程是%s,主程序父進程是%s"%(os.getpid(),os.getppid()))
#創建進程
p=multiprocessing.Process(target=test)
p.start()#啟動進程
p.join(1)#等待子進程執行完畢,可以指定等待的時間
p2=multiprocessing.Process(target=test2)
p2.start()
if__name__=='__main__':
main()
多進程之間通過Queue隊列來共享數據
importmultiprocessing
"""
一個進程向隊列Queue寫入數據,另一個進程從隊列中獲取數據
Queue.put():向隊列中寫入數據
Queue.qsize():返回當前隊列包含的消息數量
Queue.empty():如果隊列為空,返回True,反之返回False
Queue.full():如果隊列滿了,返回True,反之False
Queue.get([block[,timeout]]):獲取隊列中的一條消息,然后將其從隊列中移除
"""
deftest1(q):
"""下載數據"""
#模擬從網上下載數據
data=[1,2,3,4]
fortempindata:
q.put(temp)#寫入數據
print("下載完畢并存入隊列中")
deftest2(q):
"""解析數據"""
dw_data=[]
whileTrue:
data=q.get()#取出并移除數據
dw_data.append(data)
ifq.empty():#如果隊列為空,就退出循環
break
print(dw_data)
print("數據分析完畢")
defmain():
#創建隊列
q=multiprocessing.Queue()
#創建進程
p1=multiprocessing.Process(target=test1,args=(q,))
p2=multiprocessing.Process(target=test2,args=(q,))
p1.start()
p2.start()
if__name__=='__main__':
main()
進程池
frommultiprocessingimportPool
importtime
importos
importrandom
deftest(i):
t_start=time.time()#記錄程序開始的時間
print("%s開始執行,進程號是%d"%(i,os.getpid()))
time.sleep(random.random()*2)#random.random會隨機生成0-1之間的浮點數
t_end=time.time()#記錄程序結束的時間
print("%s執行完畢,用時%.2f秒"%(i,(t_end-t_start)))
if__name__=='__main__':
try:
po=Pool(3)#定義一個進程池,最大進程數為3
foriinrange(0,10):
#pool().apply_async(要調用的目標,(傳遞給目標的參數元組,))
#每次循環都將會用空閑出來的子進程去調用目標
po.apply_async(test,(i,))
print("開始")
po.close()#關閉進程池,關閉后po不在接收新的請求
po.join()#等待po進程池中所有子進程執行完畢,必須放在close語句之后
print("結束")
exceptExceptionasresult:
print(result)