1. 程式人生 > 實用技巧 >Python程式設計進階,Python如何實現多程序?

Python程式設計進階,Python如何實現多程序?

程序part1

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:101677771

一、程序介紹

程序就是正在執行的程式,它是作業系統中,資源分配的最小單位
資源分配:分配的是cpu和記憶體等物理資源,程序號是程序的唯一標識

獲取當前程序–子程序
非同步和同步:

1、獲取子父程序

os.getpid()

獲取當前程序的父程序

os.getppid()

為解決Windows系統和Linux系統的相容問題,下面這句話必須加上:
__name__ == “__main__”

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

執行結果:

2、程序的基本使用

引用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()

執行結果:

2、建立帶有引數的程序

在程序物件的建立處使用args進行傳參

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()

執行結果:

3、程序之間的資料彼此隔離

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)

執行結果:

如圖,子程序對count的操作沒有影響到主程序

4、多個程序之間的非同步併發

多個程序之間是非同步併發的程式,因為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())

執行結果:

如圖,因為多個程序之間是非同步併發的,所以會產生以上結果

二、join

等待當前子程序全部執行完畢後,主程序再進行執行

1、基本語法

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("主程序執行完畢")

執行結果:

2、使用自定義類的方法建立程序

自定義程序類的要求:

  • 必須繼承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("主程序執行結束")

執行結果:

三、守護程序

守護程序守護的是主程序,如果主程序中的所有程式碼執行完畢了,當前這個守護程序會被立刻殺死,立即終止。

語法:
程序.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("伺服器出現異常!")

執行結果: