Python編程進階,Python如何實現多進程?

進程part1

 

不少人學習python,不知道從何學起。
不少人學習python,掌握了基本語法事後,不知道在哪裏尋找案例上手。
不少已經作案例的人,殊不知道如何去學習更加高深的知識。
那麼針對這三類人,我給你們提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ羣:101677771python

1、進程介紹

進程就是正在運行的程序,它是操做系統中,資源分配的最小單位
資源分配:分配的是cpu和內存等物理資源,進程號是進程的惟一標識
獲取當前進程–子進程
異步和同步:服務器

一、獲取子父進程

os.getpid()

獲取當前進程的父進程併發

os.getppid()

爲解決Windows系統和Linux系統的兼容問題,下面這句話必須加上:
__name__ == 「__main__」app

def func():
	res1=os.getpid()
	res2=os.getppid()
	print(res1,res2)
#建立子進程,返回進程對象,執行func這個任務
if __name__ == "__main__":
	P=Process(target=func)
	P.start()

運行結果:
運行結果dom

二、進程的基本使用

引用multiprocessing模塊來建立以一個進程:異步

from multiprocessing import Process
import os
def func():
	print("子進程爲>>{},父進程爲>>{}".format(os.getpid(),os.getppid()))
#爲解決系統兼容性問題,必須加下面這句話
if __name__ == "__main__":
	#建立子進程,返回進程對象,執行func這個任務
	p=Process(target=func)
	#調用子進程
	p.start()

運行結果:
運行結果學習

二、建立帶有參數的進程

在進程對象的建立處使用args進行傳參spa

from multiprocessing import Process
import os
def func(m,n):
	print("子進程爲>>{},父進程爲>>{}".format(m,n))
#爲解決系統兼容性問題,必須加下面這句話
if __name__ == "__main__":
	#建立子進程,返回進程對象,執行func這個任務
	p=Process(target=func,args=(os.getpid(),os.getppid()))
	#調用子進程
	p.start()

運行結果:
運行結果操作系統

三、進程之間的數據彼此隔離

from multiprocessing  import Process
import time
count=0
def func():
	global count
	count += 1
	print("count:{}".format(count))
if __name__ == "__main__":
	p=Process(target=func)
	p.start()
	time.sleep(1)
	print(count)

運行結果:
運行結果.net

如圖,子進程對count的操做沒有影響到主進程

四、多個進程之間的異步併發

多個進程之間是異步併發的程序,由於cpu的調度策略問題,不必定哪一個程序先執行,哪一個程序後執行
總體而言,主進程比子進程建立的速度要快,cpu遇到阻塞會當即切換任務,等到阻塞態的任務變成了就緒態,cpu再回來執行
主程序會默認等到全部子程序執行結束以後,再統一關閉程序,釋放資源
若不等待,有可能在後臺存有多個未執行結束的子進程,會變成殭屍進程,不停的佔用cpu和內存。

import time,random,os
from multiprocessing import Process
def func(n):
	time.sleep(random.randrange(3))
	print("{},子進程:{},父進程:{}".format(n,os.getpid(),os.getppid()))
if __name__ == "__main__":
	for i in range(10):
		p=Process(target=func,args=(i,))
		p.start()
	print("主程序結束了")
	print(os.getpid())

運行結果:
運行結果

如圖,由於多個進程之間是異步併發的,因此會產生以上結果

2、join

等待當前子進程所有執行完畢後,主進程再進行執行

一、基本語法

import os,time
from multiprocessing import Process
def func1():
	print("子進程:{}".format(os.getpid()))
def func2():
	time.sleep(0.5)
	print("父進程:{}".format(os.getppid()))
if __name__ == "__main__":
	p1=Process(target=func1)
	p2=Process(target=func2)
	p1.start()
	p2.start()
	#引入join,全部子進程執行完成後執行主進程
	p1.join()
	p2.join()
	print("主進程執行完畢")

運行結果:
運行結果

二、使用自定義類的方法建立進程

自定義進程類的要求:

  • 必須繼承Process這個父類
  • 全部進程執行任務的邏輯必須寫在run方法裏面

基本寫法:

import os,time
from multiprocessing import Process
class MyProcess(Process):
	def run(self):
		print("子進程:{},父進程:{}".format(os.getpid(),os.getppid()))
if __name__ == "__main__":
	p=MyProcess()
	p.start()
	p.join()
	print("主進程執行結束")

帶有參數自定義類的方法:

import os,time
from multiprocessing import Process
class MyProcess(Process):
	def __init__(self,arg):
		self.arg=arg
		super().__init__()
	def run(self):
		print(self.arg)
		print("子進程:{} 主進程:{}".format(os.getpid(),os.getppid()))
if __name__=="__main__":
	p=MyProcess(arg="我是傳參")
	p.start()
	p.join()
	print("主進程執行結束")

運行結果:
運行結果

3、守護進程

守護進程守護的是主進程,若是主進程中的全部代碼執行完畢了,當前這個守護進程會被馬上殺死,當即終止。

語法:
進程.daemon = True 設置當前這個進程爲守護進程
必須在start()調用進程以前進行設置

默認:主進程會等待全部子進程執行結束後,再關閉程序,釋放資源

from multiprocessing import Process
import time
def func1():
	while True:
		time.sleep(0.5)
		print("我是守護進程!")
def func2():
	time.sleep(3)
	print("我是子進程!")
if __name__ == "__main__":
	p1=Process(target=func1)
	p2=Process(target=func2)
	p1.daemon=True
	p1.start()
	p2.start()
	time.sleep(2)
	print("主進程執行")

運行結果:
運行結果

案例:
監控報活: 利用守護進程特性,監控日誌分析服務器是否存活

from multiprocessing import Process
import time
def alive():
	while True:
		time.sleep(0.5)
		print("P1:服務器存活...")
def func():
	count=0
	while True:
		try:
			time.sleep(0.5)
			print("P2:服務器日誌分析中...")
			time.sleep(1)
			count += 1
			if count == 3:
				raise RuntimeError
		except:
			break
if __name__ == "__main__":
	p1=Process(target=alive)
	p2=Process(target=func)
	p1.daemon=True
	p1.start()
	p2.start()
	p2.join()
	print("服務器出現異常!")

運行結果:
運行結果

相關文章
相關標籤/搜索