多進程相關內容

多進程相關內容

multiprocessing模塊與process類

multiprocessing

python中的多線程無法利用多核優勢,如果想要充分地使用多核CPU的資源(os.cpu_count()查看),在python中大部分情況需要使用多進程。Python提供了multiprocessing。
multiprocessing模塊用來開啟子進程,并在子進程中執行我們定制的任務(比如函數),該模塊與多線程模塊threading的編程接口類似。

  multiprocessing模塊的功能眾多:支持子進程、通信和共享數據、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。

? 需要再次強調的一點是:與線程不同,進程沒有任何共享狀態,進程修改的數據,改動僅限于該進程內。

process類

參數介紹:

group參數未使用,值始終為Nonetarget表示調用對象,即子進程要執行的任務args表示調用對象的位置參數元組,args=(1,2,'egon',)kwargs表示調用對象的字典,kwargs={'name':'egon','age':18}name為子進程的名稱

方法介紹:

p.start():啟動進程,并調用該子進程中的p.run() 
p.run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法  p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵尸進程,使用該方法需要特別小心這種情況。如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖p.is_alive():如果p仍然運行,返回Truep.join([timeout]):主線程等待p終止(強調:是主線程處于等的狀態,而p是處于運行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的進程,而不能join住run開啟的進程  

屬性介紹:

p.daemon:默認值為False,如果設為True,代表p為后臺運行的守護進程,當p的父進程終止時,p也隨之終止,并且設定為True后,p不能創建自己的新進程,必須在p.start()之前設置p.name:進程的名稱p.pid:進程的pidp.exitcode:進程在運行時為None、如果為–N,表示被信號N結束(了解即可)p.authkey:進程的身份驗證鍵,默認是由os.urandom()隨機生成的32字符的字符串。這個鍵的用途是為涉及網絡連接的底層進程間通信提供安全性,這類連接只有在具有相同的身份驗證鍵時才能成功(了解即可)

創建子進程的兩種方式

注意:在windows中Process()必須放到# if name == 'main':下

第一種方式:

from multiprocessing import Process
import time
def task(name):print(f"{name} is running")time.sleep(3)print(f"{name} is gone")
if __name__ == '__main__':p = Process(target = task,args=('黑哥',)) # 創建一個進程對象# p = Process(target=task,kwargs={'name':'黑哥'})  兩種傳參方式p.start()  # 只是向操作系統發出一個開辟子進程的信號,然后就執行下一行了.# 這個信號操作系統接收到之后,會從內存中開辟一個子進程空間,然后在將主進程所有數據copy加載到子進程,然后在調用cpu去執行.# 開辟子進程開銷是很大的.print('==主')# 所以永遠會先執行主進程的代碼.
# 結果:
==主
黑哥 is running
黑哥 is gone

第二種方式:

from multiuprocessing import Process
import timeclass MyProcess(Process):def __init__(self,name):super().__init__()self.name = namedef run(self):  # 必須定義一個run方法print(f"{self.name} is runing")time.sleep(2)print(f"{self.name} is gone")
if __name__ == "__main__":p = MyProcess('黑哥')p.start()print('==主')
# 結果:
==主
黑哥 is running
黑哥 is gone

簡單應用:

from multiprocessing import Process
import time
def task(name):print(f"{name} is running")time.sleep(2)print(f"{name} is gone")def task1(name):print(f"{name} is running")time.sleep(2)print(f"{name} is gone")
def task2(name):print(f"{name} is running")time.sleep(2)print(f"{name} is gone")
if __name__ == '__main__':p1 = Process(target=task,args=('黑哥',))p2 = Process(target=task,args=('李業',))start_time = time.time()
#    task('黑哥')
#    task1('李業')
#    task2('海狗')
#    print(f"結束時間{time.time() - start_time}")p1.start()   # 使用多進程優化代碼運行時間p2.start() task('海狗')print(f"結束時間{time.time()-start_time}")

進程pid

如何獲取內存中的所有進程?

  • 命令行獲取所有的進程的pid tasklist

代碼級別如果獲取一個進程pid

import os
print(os.getpid())

如何獲取父進程(主進程)的pid?

import osimport time
print(f'子進程:{os.getpid()}')
print(f'主(父)進程:{os.getppid()}')

驗證進程之間的空間隔離

在同一進程中:

x = 1000
def task():global xx = 2
task()
print(x)
# 結果:
2

在不同進程中:

from multiprocessing import Process
import time
x = 1000
def task():global xx = 2if __name__ == '__main__':p = Process(target=task)p.start()time.sleep(3)print(x)
# 結果:
1000

進程對象的join方法

join讓主進程等待子進程結束之后,在執行主進程.

from multiprocessing import Process
import time
def task(name):print(f"{name} is running")time.sleep(2)print(f"{name} is gone")if __name__ == '__main__':p = Process(target=task,args=('黑哥',))p.start()p.join()print("==主")

多個子進程使用join

from multiprocessing import Process
import timedef task(name,sec):print(f"{name} is running")time.sleep(sec)print(f"{name} is gone")if __name__ == '__main__':start_time = time.time()p1 = Process(target=task,args=('黑哥',1))p2 = Process(target=task,args=('李業',2))p3 = Process(target=task,args=('海狗',3))p1.start()p2.start()p3.start()p1.join()p2.join()p3.join()print(f"==主{time.time()-start_time}")
# 結果:
李業 is running
黑哥 is running
海狗 is running
黑哥 is gone
李業 is gone
海狗 is gone
==主3.6357808113098145
from multiprocessing import Process
import time
def task(name,sec):print(f'{name} is running')time.sleep(sec)print(f"{name} is gone")
if __name__ == '__main__':start_time = time.time()p1 = Process(target=task,args=('黑哥',3))p2 = Process(target=task,args=('李業',2))p3 = Process(target=task,args=('海狗',4))p1.start()p2.start()p3.start()p1.join()print(f"==主1:{time.time()-start_time}")p2.join()print(f"==主2:{time.time()-start_time}")p3.join()print(f"==主3:{time.time()-start_time}")
# 結果:
黑哥 is running
海狗 is running
李業 is running
李業 is gone
黑哥 is gone
==主1:3.741270065307617
==主2:3.741270065307617
海狗 is gone
==主3:4.746762990951538

相關面試題:

# 優化下面的代碼:
from multiprocessing import Process
import timedef task(sec):print(f'is running')time.sleep(sec)print(f' is gone')if __name__ == '__main__':start_time = time.time()p1 = Process(target=task,args=(1,))p2 = Process(target=task,args=(2,))p3 = Process(target=task,args=(3,))p1.start()p2.start()p3.start()# join 只針對主進程,如果join下面多次join 他是不阻塞的.p1.join()p2.join()p3.join()# 正確解法:
from multiprocessing import Process
import timedef task(sec):print(f"is running")time.sleep(sec)print(f"is gone")if __name__ == '__main__':p1 = Process(target=task,args=('常鑫',3))p2 = Process(target=task,args=('立業',2))p3 = Process(target=task,args=('還夠',4))start_time = time.time()p1.start()p2.start()p3.start()lst = []for i in range(1,4):p = Process(target=task,args = (i,))p.start()lst.append(p)for i in lst:i.join()print(f"{i}", f'{time.time() - start_time}')

進程對象的其他屬性

from multiprocessing import Process
import timedef task(name):print(f"{name} is running")time.sleep(2)print(f"{name} is gone")if __name__ == '__main__':# p = Process(target=task,args=('黑哥',))p = Process(target=task,args=('黑哥',),name='alex')p.start()time.sleep(1)p.terminate()  # 殺死子進程p.join()time.sleep(0.5)print(p.is_alive())  # 判斷進程是否存在print(p.name)p.name = 'sb'  # 給子進程起名字print(p.name)print('==主開始')

守護進程

子進程守護著主進程,只要主進程結束,子進程跟著就結束,

主進程創建守護進程

  其一:守護進程會在主進程代碼執行結束后就終止

  其二:守護進程內無法再開啟子進程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children

注意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止

import time
def task(name):print(f"{name} is running")time.sleep(2)print(f"{name} is gone")if __name__ == '__main__':p = Process(target=task,args=('黑哥',))p.daemon = True  # 一定要在子進程開啟之前設置p.start()time.sleep(1)print('==主')
# 結果:
黑哥 is running
==主

轉載于:https://www.cnblogs.com/lifangzheng/p/11384000.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS中SQLite持久化存儲第三方庫FMDB

interface HMShopTool : NSObject (NSArray *)shops; (void)addShop:(HMShop *)shop; end implementation HMShopTool static FMDatabase *_db; (void)initialize { // 1.打開數據庫 NSString *path [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, N…

python超神之路:python異常對照表

python異常對照表 異常名稱描述BaseException所有異常的基類SystemExit解釋器請求退出KeyboardInterrupt用戶中斷執行(通常是輸入^C)Exception常規錯誤的基類StopIteration迭代器沒有更多的值GeneratorExit生成器(generator)發生異常來通知退出StandardError所有的內建標準異常…

python超神之路:創建對象的9種方法

python生成對象的9種方法 class Point:def __init__(self,x,y):self.x xself.y y import sys import copy import typespoint1 Point(1,2) point2 eval("{}({},{})".format("Point",1,2)) point3 globals()[Point](1,2) point4 locals()["Point…

面向接口的編程

面向接口的編程,將接口與實現分離,可以極大的降低代碼的耦合,比如在編程中使用的加密接口,如果將具體的加密算法寫入到使用加密的地方,這樣就會導致,下一次加密方法發生改變的時候會導致大量的地方需要修改…

ASP.NET Core Web 應用程序系列(三)- 在ASP.NET Core中使用Autofac替換自帶DI進行構造函數和屬性的批量依賴注入(MVC當中應用)...

在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替換自帶DI進行構造函數的批量依賴注入,本章將和大家繼續分享如何使之能夠同時支持屬性的批量依賴注入。 約定: 1、倉儲層接口都以“I”開頭,以“Repository”結尾。倉儲層實現都以…

可視化caffe模型結構及在線可視化

在線可視化caffe模型結構 http://ethereon.github.io/netscope/#/editor 假設Caffe的目錄是$(CAFFE_ROOT) 1.編譯caffe的python接口 $ make pycaffe 2.裝各種依賴 $ pip install pydot $ sudo apt-get install graphviz 3.可視化模型 draw_net.py執行的時候帶三個參數 …

布式緩存系統Memcached簡介與實踐

緣起: 在數據驅動的web開發中,經常要重復從數據庫中取出相同的數據,這種重復極大的增加了數據庫負載。緩存是解決這個問題的好辦法。但是ASP.NET中的雖然已經可以實現對頁面局部進行緩存,但還是不夠靈活。此時Memcached或許是你想要的。Memca…

仿百度翻頁(轉)

https://www.cnblogs.com/fozero/p/9874334.html 轉載于:https://www.cnblogs.com/hj0711/p/11390203.html

matlab 多核并行編程

在使用matlab處理大數據,編程需要注意兩個問題:并行運算和釋放內存。matlab也提供了并行計算的功能,甚至能用GPU加速。并行計算工具箱,叫做parallel computing toolbox.它的使用方法,可以從matlab的幫助獲得。 Parall…

iOS核心動畫之CALayer(1)

本文目錄 一、什么是CALayer二、CALayer的簡單使用 回到頂部一、什么是CALayer * 在iOS系統中,你能看得見摸得著的東西基本上都是UIView,比如一個按鈕、一個文本標簽、一個文本輸入框、一個圖標等等,這些都是UIView。 * 其實UIView之所以能顯…

ASP.NET Core Web 應用程序系列(四)- ASP.NET Core 異步編程之async await

PS:異步編程的本質就是新開任務線程來處理。 約定:異步的方法名均以Async結尾。 實際上呢,異步編程就是通過Task.Run()來實現的。 了解線程的人都知道,新開一個線程來處理事務這個很常見,但是在以往是沒辦法接收線程里…

iOS核心動畫之CALayer-layer的創建

本文目錄 一、添加一個簡單的圖層二、添加一個顯示圖片的圖層三、為什么CALayer中使用CGColorRef和CGImageRef這2種數據類型,而不用UIColor和UIImage?四、UIView和CALayer的選擇五、UIView和CALayer的其他關系 * 上一講已經說過,UIView內部默…

iOS核心動畫之CALayer-隱式動畫

本文目錄 一、隱式動畫屬性二、position和anchorPoint 回到頂部一、隱式動畫屬性 * 在前面幾講中已經提到,每一個UIView內部都默認關聯著一個CALayer,我們可用稱這個Layer為Root Layer(根層)。所有的非Root Layer,也就…

多進程補充

多進程補充 僵尸進程和孤兒進程 基于unix環境(linux,macOS) 主進程需要等待子進程結束之后,主進程才結束 主進程時刻監測子進程的運行狀態,當子進程結束之后,一段時間之內,將子進程進行回收.為什么主進程不在子進程結束后馬上對其回收呢? 主進程與子進程是異步關系.主進程無法…

iOS核心動畫之CALayer-自定義層

本文目錄 一、自定義層的方法1二、自定義層的方法2 三、其他 自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。 回到頂部一、自定義層的方法1 方法描述:創建一個CALayer的子類,然后覆蓋drawInContext:方…

iOS核心動畫之CoreAnimation

本文目錄一、Core Animation簡介二、Core Animation的使用步驟三、CAAnimation四、CAPropertyAnimation 回到頂部一、Core Animation簡介 * Core Animation,中文翻譯為核心動畫,它是一組非常強大的動畫處理API,使用它能做出非常炫麗的動畫效果…

抽象類

當編寫一個類時,我們往往會為該類定義一些方法,這些方法是用來描述該類的功能具體實現方式,那么這些方法都有具體的方法體。 也就是編輯一個類 這個類不是絕體的東西 是一個抽象的 例如 描述JavaEE工程師:行為:工作。 …

iOS核心動畫 Core Animation2-CABasicAnimation

Core Animation2-CABasicAnimation 本文目錄 一、平移動畫二、縮放動畫三、旋轉動畫四、其他 CABasicAnimation是CAPropertyAnimation的子類,使用它可以實現一些基本的動畫效果,它可以讓CALayer的某個屬性從某個值漸變到另一個值。下面就用CABasicAnimat…

OpenStack Telemetry系統架構及實踐

1. 概述 早期OpenStack的計量功能由Ceilometer項目負責,后來Ceilometer一分為四,每個項目負責一個方面的工作。不得不說這是OpenStack開發中的一個特色,比如Cinder和Neutron也是從早期的Nova中拆分出來的。 OpenStack Telemetry體系的架構如下…

產品經理十二時辰:內容過于真實,扎心了!

各大平臺也紛紛借勢: 《阿里十二時辰》 《優酷十二時辰》 《垃圾十二時辰》 《深圳十二時辰》 《北京十二時辰》 《考研人十二時辰》 …… 各種十二時辰刷爆朋友圈。 后臺很多留言: 起點學院怎么沒有出《產品經理十二時辰》呢?你這產品經理教…