python多进程_Python多进程实践
生活随笔
收集整理的這篇文章主要介紹了
python多进程_Python多进程实践
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文重點探究以下幾個內容:
- 創建進程Process
- 進程間數據傳遞Queue/Pipe/Value/Array/Manager
- 進程池Pool
創建進程Process
創建進程方式如下:
- 可以看出,Process的用法與Thread類似,守護進程設置方式為deamon屬性。由于join為0.5且為守護進程,因此不等守護進程運行結束主程序已退出。若增加另一非守護進程,則必須等非守護進程結束,守護進程才能退出
- 同樣,可以通過繼承Process實現進程
進程間數據傳遞Queue/Pipe/Value/Array/Manager
可以通過Lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。
Queue
使用方式
構造:
- multiprocessing.Queue([maxsize])
限制隊列長度
類方法:
- qsize()
返回隊列的大致大小,因為多進程或者多線程一直在消耗隊列,因此該數據不一定正確 - empty()
判斷隊列是否為空,如果是,則返回True,否則False - full()
判斷隊列是否已滿,如果是,則返回True,否則False - put(obj[, block[, timeout]])
將對象放入隊列,可選參數block為True,timeout為None - get()
從隊列取出對象
Pipe
使用方式
構造
- conn1, conn2 = multiprocessing.Pipe([duplex])
若duplex為True(默認),則是雙向的,False則是單向的。 conn1只能接受,conn2只能發送。
Value和Array
Manager
更多類型支持一般使用Manager,支持的類型包括list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array,使用方式如下:
進程池
一般使用方式如下:
構造函數
multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])
- 若processes沒有傳,則默認為 os.cpu_count()
類方法
- apply(func[, args[, kwds]])
在返回結果前,將一直阻塞進程,注意:func只在一個進程中運行 - apply_async(func[, args[, kwds[, callback[, error_callback]]]])
在需要并行的場景中,一般用此方法更好。當result準備好時就調用callback,失敗則調用error_callback,注意:自定義回調函數只接受一個參數且時非阻塞的。 - map(func, iterable[, chunksize])
為map()函數的并行版。將可迭代對象拆成小塊,放到不同進程中運行。對于內存占用大的可迭代對象,一般使用imap或imap_unordered - map_async(func, iterable[, chunksize[, callback[, error_callback]]])
非阻塞版。 - imap(func, iterable[, chunksize])
注意:若iterable很長時,chunksize(默認為1)設一個大的值速度更快。 - imap_unordered(func, iterable[, chunksize])
無序(若進程個數為1,則順序一致)
以上部分代碼來自官方文檔:https://docs.python.org/3/library/multiprocessing.html
總結
以上是生活随笔為你收集整理的python多进程_Python多进程实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 呀一耶呀一耶是哪首歌啊?
- 下一篇: 煮开头的成语有哪些啊?