26日目:父プロセスと子プロセス、ゾンビプロセスと孤立プロセス、デーモンプロセスミューテックスとセマフォ

pyプログラムの実行は、Pythonインタープリタープロセスを開始することであり、pyプログラムの下で開かれる子プロセスもPythonインタープリタープロセスです。
pythonインタープリターでpyファイルを開始することは、pythonインタープリタープロセスを開始することと同じです。基本的な原則は、pythonインタープリターが開始された後
、pyファイルのコンテンツを読み取り、インタープリターの操作を通じてファイルコンテンツを実行することです。

pidは、オペレーティングシステム内のタスクの一意の番号です

在windows系统下:
    通过cmd命令查看所有pid进程命令:tasklist
    通过pid号查看进程的命令:tasklist | findstr (pid号)
    强制杀死进程的命令:taskkill /F /PID (pid号)
在linux系统下:
    查看所有进程的命令:ps aux
    通过pid号查看进程的命令:ps aux | grep (pid号)
    强制杀死进程的命令:kill -9 (pid号)

親プロセスと子プロセス

from multiprocessing import Process
import os
import time

def task():
    print("父进程:%s  子进程:%s" % (os.getppid(), os.getpid()))
    time.sleep(500)


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

    print("主进程的pid:%s 主进程的父进程pid:%s" % (os.getpid(), os.getppid()))

主进程的pid:7272(该运行文件的pid)     主进程的父进程pid:10208(pycharm的pid,windows系统下通过cmd查看不到主进程的父进程也是显示python解释器的)
父进程:7272(该运行文件的pid)       子进程:15684(该文件下子进程task的pid)

ゾンビプロセス孤立プロセス(Linuxシステムで実行される概念)の
開始とjionには、独自のゾンビプロセスクリーンアップ機能があります。

ゾンビプロセス
は、Linuxオペレーティング
システムの特別なデータ構造です。Linuxシステムのすべての子プロセスは、死後ゾンビに入ります。
ゾンビプロセス:子プロセスが終了した後、プロセスの重いリソース(cpu、メモリ、開いているファイル)が解放され、子プロセスのプロセス記述子(pidなど)がシステムに保存されます。
ゾンビプロセスは、プログラムが正常に終了した場合にのみ生成されます。親プロセスが強制的に閉じられると、オペレーティングシステムは、親プロセスの実行が終了したすべての子プロセスを削除し、ゾンビプロセスは生成されません。

ゾンビプロセスの害
システムpid番号は制限されています。ゾンビプロセスによって保持されている情報が解放されていない場合、蓄積により使用可能なpid番号がなくなり、システムは新しいプロセスを生成できません。

Linuxシステム
ゾンビプロセスを処理する方法アプリケーションのゾンビプロセスが遅れている場合は、次のコマンドを使用して、ゾンビプロセスの息子を再利用するように親プロセスに通知できます。kill-CHLD(親プロセスのpid)
アプリケーションにゾンビプロセス回復メカニズムがない場合は、親プロセスを直接強制終了し、プロセス番号1の
initプロセスに、親プロセスinitの下のすべての子プロセスを制御させて、ゾンビプロセスを自動的に再利用します[コマンドプロセスを強制終了します:kill -9(pid番号)]

孤立したプロセス(無害)
親プロセスが終了し、その子プロセスの1つ以上がまだ実行されている場合、それらの子プロセスは孤立したプロセスになります
。親プロセスの終了後、孤立したプロセスはinitプロセスによって採用されます(プロセス番号1)、およびinitプロセスは、それらの状態収集作業を完了します。

デーモン(知識ポイントの理解)
デーモンは、ライフサイクルではなく、メインプロセスのコードを保護します

主进程代码运行完毕,守护进程就会结束
from multiprocessing import Process
import os, time


def task():
    print("进程%s开启" % os.getpid())
    time.sleep(10)
    print("进程%s结束" % os.getpid())


if __name__ == '__main__':
    p = Process(target=task)
    p.daemon = True   # 这一行代码会把子进程变成守护代码,主进程运行完,子进程也就运行完了,不会打印进程结束的那行代码
    p.start()
    print("主:%s" % os.getpid())
    time.sleep(3)

ケーススタディ

from multiprocessing import Process
import time


def foo():
    print(123)
    time.sleep(1)
    print("end123")


def bar():
    print(456)
    time.sleep(3)
    print("end456")


if __name__ == '__main__':
    p1 = Process(target=foo)
    p2 = Process(target=bar)

    p1.daemon = True
    p1.start()
    p2.start()
    print("main-------")
    
可能会出现的情况(大部分都是第一种情况)
"""
main-------
456
end456
"""

"""
main-------
123
456
end456
"""

"""
123
main-------
456
end456
"""

ミューテックスとセマフォ

ロックにより、複数のプロセスが同じデータを変更する場合、同時に変更できるタスクは1つだけになります。つまり、シリアル変更により、速度は低下しますが、データのセキュリティは確保されます。
ファイル共有データを使用してプロセス間通信を実現することはできますが、問題は次のとおり
です。1。効率が低い(共有データはファイルに基づいており、ファイルはハードディスク上のデータ
です2。自分自身をロックする必要があります。

セマフォとは、同時に実行されているロックの数を指します

ミューテックスロックコードの実装

db1.json
{
    
    "COUNT": 3}
# 模拟抢票案例,需求:利用互斥锁实现局部串行的效果(串行并不是真正意义上的串行,还是由cpu去实现并行,只不过是一旦有进程抢到了锁,其他的进程都是在阻塞的状态)
from multiprocessing import Process
from multiprocessing import Lock  # 导入Lock,调用Lock会的得到一把锁,这把锁就是互斥锁
import json
import os
import time


def check():
    with open("db1.json", mode="rt", encoding="utf-8")as f:
        time.sleep(1)        # 模拟网络延迟
        dic = json.load(f)
        print("%s查看剩余票数为:%s" % (os.getpid(), dic["COUNT"]))


def get():
    with open("db1.json", mode="rt", encoding="utf-8")as f:
        time.sleep(1)       # 模拟网络延迟
        dic = json.load(f)

    if dic["COUNT"] > 0:
        dic["COUNT"] -= 1
        time.sleep(3)       # 模拟网络延迟
        with open("db1.json", mode="wt", encoding="utf-8")as f:
            json.dump(dic, f)
            print("%s购票成功" % os.getpid())

    else:
        print("购票失败")

def func(mutex):
    check()

    mutex.acquire()  # 抢锁
    get()
    mutex.release()  # 释放锁
    # cup也是处于并行的状态,但是一旦有进程抢到了锁,其他进程就是阻塞的状态

    # with mutex:  写法2
    #     get()


if __name__ == '__main__':
    mutex = Lock()

    for i in range(10):
        p = Process(target=func, args=(mutex,))
        p.start()

    print("主")

おすすめ

転載: blog.csdn.net/Yosigo_/article/details/112913541