日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python-多进程

發(fā)布時間:2023/12/18 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python-多进程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、多進程

from multiprocessing import Process import osdef func1(num):print(num)if __name__ == '__main__':print('主進程id為:', os.getpid()) #獲取主進程idfor i in range(10):p = Process(target=func1,args=(i,)) #創(chuàng)建子進程p.start() #調(diào)起子進程print('子進程名稱為:', p.name) #獲取子進程名稱print('子進程id為', p.pid) #獲取子進程id

?

二、同時運行多進程時,每個進程默認都擁有一份獨立的數(shù)據(jù);通過全局變量并不能實現(xiàn)進程間的數(shù)據(jù)通信

a = 1 def func2():global aa +=1print('子進程中的a:', a) #子進程中的a: 2 if __name__ == '__main__':p = Process(target=func2)p.start()p.join()print('主進程中的a:', a) #主進程中的a: 1

?

三、進程間數(shù)據(jù)通信

1、借助Queue、pipe等進行通信

from multiprocessing import Process, Queue import os, time, randomdef write_queue(q): #寫數(shù)據(jù)到隊列for value in range(10):print('Put %s to queue...'%value)q.put(value)time.sleep(2) #每隔2秒寫入數(shù)據(jù)def read_queue(q): #從隊列讀取數(shù)據(jù)while True:value = q.get(True)print('Get %s from queue.' %value)time.sleep(3) #每隔3秒讀取數(shù)據(jù)if q.empty(): #若隊列為空,退出循環(huán)print('隊列為空,請輸入數(shù)據(jù)后再讀')breakif __name__=='__main__':q = Queue() #父進程創(chuàng)建Queue,傳給子進程pw = Process(target=write_queue, args=(q,))pr = Process(target=read_queue, args=(q,))start = time.time()pw.start() #啟動子進程pw,寫數(shù)據(jù)pr.start() #啟動子進程pr,讀數(shù)據(jù) pw.join()end_pw = time.time()run_pw = end_pw - start #計算寫數(shù)據(jù)的時間pr.join() #terminate()可強行終止進程end_pr = time.time()run_pr = end_pr - start #計算讀數(shù)據(jù)的時間print('寫數(shù)據(jù)花費時間:', run_pw, '讀數(shù)據(jù)花費時間', run_pr)

?

2、借助Manager實現(xiàn)進程間的數(shù)據(jù)通信;Manager支持的類型非常多,包括: Value,Array,list, dict,Queue, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event等

from multiprocessing import Process, Manager import timedef func(p_dict, p_list): #入?yún)?#xff1a;p_dict為字典,p_list為listfor i in range(10):time.sleep(2)k = str(i) + '*' + str(i)p_dict[k] = i * ifor i in range(10):time.sleep(1)p_list.append(i)if __name__ == "__main__":manager = Manager()dt = manager.dict() #創(chuàng)建dict實例lt = manager.list() #創(chuàng)建list實例start = time.time()p = Process(target=func, args=(dt, lt))p.start()p.join()end = time.time()run_time = end - startprint(dt, '\n', lt)print('運行時間為:',run_time) #運行時間大約為30s

?

四、進程池

1、通過apply_async()可批量創(chuàng)建子進程

2、從進程池獲取進程時,先判斷進程池是否已滿;若進程池滿了,則需要等待進程池重新有空余的進程(池中其他被調(diào)用的子進程結(jié)束),再繼續(xù)

from multiprocessing import Pool import time def func2(num):time.sleep(2)print(num) if __name__ == '__main__':start = time.time()pool = Pool(5) #創(chuàng)建進程池,最多可同時運行5個子進程for i in range(5):pool.apply_async(func=func2,args=(i,)) #apply_async()調(diào)用子進程print('執(zhí)行主程序')pool.close()pool.join() #等待子進程結(jié)束再結(jié)束主進程end = time.time()run_time = end - startprint(run_time)

run_time的時間取決于進程池的個數(shù)pool = Pool(N):

1)當N=2時,每次只能從進程池取2個子進程,5個子進程要分三次調(diào)用:run_time = 2 + 2 + 2

2)當N=3時,每次只能從進城池取3個子進程,5個子進程要分2次調(diào)用:run_time = 2 + 2

3)當N>=5時,可同時調(diào)用5個子進程:run_time = 2

?

轉(zhuǎn)載于:https://www.cnblogs.com/jessicaxu/p/8005256.html

總結(jié)

以上是生活随笔為你收集整理的Python-多进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。