python?包之?multiprocessing?多進(jìn)程
一、創(chuàng)建一個(gè)進(jìn)程
- 實(shí)例化 Process 類創(chuàng)建一個(gè)進(jìn)程對(duì)象
- 然后調(diào)用它的 start 方法即可生成一個(gè)子進(jìn)程
from multiprocessing import Process def func(s): print(s) if __name__ == '__main__': p = Process(target=func, args=('autofelix', )) p.start() p.join()
二、創(chuàng)建多個(gè)進(jìn)程
from multiprocessing import Process def func(s): print(s) if __name__ == '__main__': process = [ Process(target=func, args=('1', )) Process(target=func, args=('2', )) ] [p.start() for p in process] [p.join() for p in process]
三、管道pipe進(jìn)行進(jìn)程間通信
Pipe(duplex=True):表示雙工通信,也就是雙向的,既可以接受也可以發(fā)送數(shù)據(jù),默認(rèn)為True
Pipe(duplex=False):表示單工通信,也就是單向的,只能進(jìn)行接受或者發(fā)送數(shù)據(jù)
from multiprocessing import Process, Pipe def func(conn): print('send a list object ot other side...') # 從管道對(duì)象的一端發(fā)送數(shù)據(jù)對(duì)象 conn.send(['33', 44, None]) conn.close() if __name__ == '__main__': # 默認(rèn)創(chuàng)建一個(gè)雙工管道對(duì)象,返回的兩個(gè)對(duì)象代表管道的兩端, # 雙工表示兩端的對(duì)象都可以發(fā)送和接收數(shù)據(jù),但是需要注意, # 需要避免多個(gè)進(jìn)程或線程從一端同時(shí)讀或?qū)憯?shù)據(jù) parent_conn, child_conn = Pipe() p = Process(target=func, args=(child_conn, )) p.start() # 從管道的另一端接收數(shù)據(jù)對(duì)象 print(parent_conn.recv()) p.join()
四、隊(duì)列Queue進(jìn)行進(jìn)程間通信
- 當(dāng)向隊(duì)列中放入的數(shù)據(jù)較大時(shí),就會(huì)在
join()
處卡死 - 為了避免這種情況,常的做法是先使用get()將數(shù)據(jù)取出來(lái),再使用join()方法
- 如果不這樣處理,隊(duì)列進(jìn)程將不能正常終止,造成死鎖情況
from multiprocessing import Process, Queue def func(q): print('put a list object to queue...') # 向Queue對(duì)象中添加一個(gè)對(duì)象 q.put(['33', 44, None]) if __name__ == '__main__': # 創(chuàng)建一個(gè)隊(duì)列 q = Queue() p = Process(target=func, args=(q, )) p.start() # 從Queue對(duì)象中獲取一個(gè)對(duì)象 print(q.get()) p.join() ----------------------------------- ?著作權(quán)歸作者所有:來(lái)自51CTO博客作者autofelix的原創(chuàng)作品,謝絕轉(zhuǎn)載,否則將追究法律責(zé)任 python 包之 multiprocessing 多進(jìn)程教程 https://blog.51cto.com/autofelix/5166197
五、進(jìn)程間同步
- 使用鎖保證進(jìn)程間的同步操作
from multiprocessing import Process, Lock def func(lc, num): # 使用鎖保證以下代碼同一時(shí)間只有一個(gè)進(jìn)程在執(zhí)行 lc.acquire() print('process num: ', num) lc.release() if __name__ == '__main__': lock = Lock() for i in range(5): Process(target=func, args=(lock, i)).start()
六、進(jìn)程間共享數(shù)據(jù)
- 使用共享內(nèi)存的方式,共享值Value對(duì)象和數(shù)據(jù)Array對(duì)象
from multiprocessing import Process, Value, Array def func(n, a): n.value = 3.333 for i in range(len(a)): a[i] = -a[i] if __name__ == '__main__': # 第一個(gè)參數(shù)d表示數(shù)據(jù)類型'double'雙精度浮點(diǎn)類型 num = Value('d', 0.0) # 第一個(gè)參數(shù)i表示數(shù)據(jù)類型'integer'整型 arr = Array('i', range(6)) p = Process(target=func, args=(num, arr)) p.start() p.join() print(num.value) print(arr[:])
七、進(jìn)程池
- 創(chuàng)建一個(gè)
Pool
進(jìn)程池對(duì)象,并執(zhí)行提交給它的任務(wù) - 進(jìn)程池對(duì)象允許其中的進(jìn)程以不同的方式運(yùn)行
- 但是需要注意,Pool 對(duì)象的方法只能是創(chuàng)建它的進(jìn)程才能調(diào)用
from multiprocessing import Pool import time def f(x): return x * x if __name__ == '__main__': with Pool(processes=4) as pool: # start 4 worker processes # 在進(jìn)程池中開(kāi)啟一個(gè)新的進(jìn)程并執(zhí)行 f 函數(shù) result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow # map會(huì)一直阻塞當(dāng)前進(jìn)程直到運(yùn)行完可迭代對(duì)象中的所有元素,并返回結(jié)果。 print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]" # imap是map方法的延遲執(zhí)行版本,對(duì)于比較消耗內(nèi)存的迭代,建議使用這個(gè)方法, it = pool.imap(f, range(10)) print(next(it)) # prints "0" print(next(it)) # prints "1" print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow result = pool.apply_async(time.sleep, (10,)) print(result.get(timeout=1)) # raises multiprocessing.TimeoutError
到此這篇關(guān)于python 包之 multiprocessing
多進(jìn)程的文章就介紹到這了,更多相關(guān)python multiprocessing 多進(jìn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Python 函數(shù)聲明先后順序出現(xiàn)的問(wèn)題
這篇文章主要介紹了如何解決Python 函數(shù)聲明先后順序的問(wèn)題,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09利用Python?Matlab繪制曲線圖的簡(jiǎn)單實(shí)例
們經(jīng)常會(huì)遇到這種情況,有一個(gè)數(shù)學(xué)函數(shù),我們希望了解他的圖像,這個(gè)時(shí)候使用python 的matplotlib就可以幫助我們,下面這篇文章主要介紹了利用Python?Matlab繪制曲線圖的相關(guān)資料,需要的朋友可以參考下2021-12-12Python 創(chuàng)建子進(jìn)程模塊subprocess詳解
這篇文章主要介紹了Python 創(chuàng)建子進(jìn)程模塊subprocess詳解,本文詳細(xì)講解了subprocess模塊的方法、參數(shù)、使用實(shí)例等,需要的朋友可以參考下2015-04-04Jupyter安裝nbextensions,啟動(dòng)提示沒(méi)有nbextensions庫(kù)
這篇文章主要介紹了Jupyter安裝nbextensions,啟動(dòng)提示沒(méi)有nbextensions庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Python開(kāi)發(fā)之利用re模塊去除代碼塊注釋
Python的re模塊主要是正則表達(dá)式的操作函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python開(kāi)發(fā)之利用re模塊去除代碼塊注釋的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11