0817 Pythonまとめ-プロセス、join、デーモン

27866 ワード

一.プロセス
プロセスは、オペレーティングシステムにおけるリソース割り当ての最小単位である実行中のプログラムである.プロセス番号はプロセスの唯一の識別プロセスとプロセスの関係である:データは互いに隔離され、socket通信によって同時に実行される:1つのcpuが同じ時間に複数のプログラム並列を実行しない:複数のcpuが同じ時間に複数のプログラムcpuを実行しないプロセススケジューリング方法:まずfcfs(first come first server):先に短いジョブ優先アルゴリズムを実行する:割り当てられたcpuが多く、まず短い計算タイムスライスの回転アルゴリズムを終了する:タスクごとにタイムスライスを実行する時間.そして他のことを実行する.マルチレベルフィードバックキューアルゴリズム
時間が長ければ長いほど、cpuが割り当てるリソースが少なくなり、優先度が後ろにあるほど時間が短くなり、cpuが割り当てるリソースが多くなります.
プロセスの3つのステータス:準備、実行、ブロック
import os,time,random

ps-auxプロセス番号ps-aux|grepプロセス番号kill-9プロセス番号を表示
現在のプロセスidの取得(サブプロセス)
res = os.getpid()
print(res)

現在のプロセスの親プロセスの取得
res = os.getppid()
print(res)

1.プロセスの基本的な使用
from multiprocessing import Process
def func():
	print("1.   id>>{},2.   id>>{}".format(os.getpid(), os.getppid()))

#     Windows Linux       ,         ,    
if __name__ == '__main__':
	#      ,      ,  func    
	p = Process(target=func)
	#      
	p.start()

2.パラメータ付きプロセスの作成
def func(n):
	for i in range(1, n+1):
		print("1.   id>>{},2.   id>>{}".format(os.getpid(), os.getppid()))

if __name__ == '__main__':
	n = 5
	#      
	p = Process(target=func, args=(n,))
	#      
	p.start()

	for i in range(1, n+1):
		print("*" * i)

3.プロセス間のデータの分離
count = 10
def func():
	global count
	count += 1
	print("     count={}".format(count))

if __name__ == '__main__':
	p = Process(target=func)
	p.start()
	time.sleep(1)
	print(count)

4.複数のプロセス間の非同期同時実行
CPUのスケジューリングポリシーの問題のため、どのタスクが先に実行され、どのタスクが後に実行されるかは必ずしも限らない.全体的に、メインプロセスはサブプロセスよりも作成速度が速く、CPUがブロックに遭遇するとすぐにタスクを切り替え、ブロック状態のタスクが準備状態になるまで、CPUが戻って実行する.
メインプログラムは、すべてのサブプログラムの実行が終了するまでデフォルトで待機し、プログラムを統一的に閉じ、リソースを解放します.待たなければ、バックグラウンドに複数の未実行終了のサブプロセスがある可能性があり、ゾンビプロセスになり、CPUを占有し続け、メモリがシステムの圧力を増加するため、プロセスの管理に便利であり、メインプログラムはデフォルトでサブプロセスを待つ.
def func(n):
	time.sleep(random.randrange(3))
	print("  {}<=>1.   id>>{},2.   id>>{}".format(n, os.getpid(), os.getppid()))

if __name__ == '__main__':
	for i in range(1, 11):
		Process(target=func, args=(i,)).start()

	print("        ...")
	print(os.getpid())

二.join
join現在のサブプロセスがすべて実行されるのを待ってから、メインプロセスが再実行されます(サブ親プロセスを同期するために使用されます).
from multiprocessing import Process
import time,os

1.join基本構文
def func():
	print("       ,     ")

if __name__ == '__main__':
	p = Process(target=func)
	p.start()

	#                ,          , join 
	p.join()
	# time.sleep(1)
	print("       ,     6 ")

2.複数のサブプロセスのシーンでjoinを使用する
def func(i):
	time.sleep(1)
	print("   %s   ,      " % (i))

if __name__ == '__main__':
	lst = []
	for i in range(10):
		p = Process(target=func, args=(i,))
		p.start()
		lst.append(p)

	for i in lst:
		i.join()

	print("          :    ~")

三.カスタムクラスメソッドを使用したプロセスの作成
カスタムプロセスクラスの要件:(1)プロセスという親を継承しなければならない(2)すべてのプロセスが実行しなければならない論理はrunメソッドに書かなければならない
1.基本文法
class MyProcess(Process):
	def run(self):
		print("1.   id>>{},2.   id>>{}".format(os.getpid(), os.getppid()))

if __name__ == '__main__':
	p = Process()
	p.start()
	print("3.   id>>{},4.   id>>{}".format(os.getpid(), os.getppid()))

2.パラメータ付きカスタムクラスのメソッド
class MyProcess(Process):
	def __init__(self, arg):
		#              (         )
		super().__init__()
		self.arg = arg

	def run(self):
		print("1.   id>>{},2.   id>>{}".format(os.getpid(), os.getppid()))
		print(self.arg)

if __name__ == '__main__':
	p = MyProcess("        ")
	p.start()
	print("3.   id>>{},4.   id>>{}".format(os.getpid(), os.getppid()))

四.デーモンプロセス
デーモンはメインプログラムを守り、メインプログラムのすべてのコードが実行されると、現在のデーモンはすぐに殺され、すぐに終了します.構文:プロセス.daemon=True現在このプロセスを設定デーモンプロセスのためにstart()呼び出しプロセスの前に書く必要があります設定
デフォルト:メインプロセスは、すべてのサブプロセスの実行が終了するまでデフォルトで待機し、プログラムを閉じてリソースを解放します.
from multiprocessing import Process
import time

1.基本使用
def func():
	print("start     ")
	time.sleep(1)
	print("end     ")
	
if __name__ == '__main__':
	p = Process(target=func)
	p.daemon = True
	p.start()

	print("       ...")

2.複数のサブプロセスのシーン
def func1():
	count = 1
	while True:
		print("*" * count)
		time.sleep(0.5)
		count += 1

def func2():
	print("start func2        ")
	time.sleep(3)
	print("end   func2        ")

if __name__ == '__main__':
	p1 = Process(target=func1)
	p2 = Process(target=func2)

	#   p1           
	p1.daemon = True

	p1.start()
	p2.start()

	time.sleep(1)

	print("       ...")

3.プロセスの実際の用途を守る:報活を監視する
#     
def alive():
	while True:
		print("           ,         ,i am alive~")
		time.sleep(1)

#     
def func():
	while True:
		try:
			time.sleep(1)
			raise RuntimeError
			# print("  5      :         ...")
		except:
			break

if __name__ == '__main__':
	#   2    
	p1 = Process(target=alive)
	p2 = Process(target=func)
	#   p1     
	p1.daemon = True

	p1.start()
	p2.start()

	#     p2        ,     
	p2.join()

	print("         ...")