좀비와 고아 뮤텍스 프로세스 간의 통신

좀비 프로세스 및 고아

유닉스 기반 환경 (리눅스, 맥 OS)

주요 프로세스가 끝날 때까지, 자식 프로세스의 종료에 대한 주요 과정을 기다릴 필요가 후

주요 과정은 항상 시간 이내에, 때 자식 프로세스 후, 실행 재활용을 위해 자식 프로세스를 자식 프로세스를 모니터링

왜 기본 프로세스 자식 프로세스는 재활용 그것의 종료 후 즉시 아닌가요?

주요 프로세스 및 하위 프로세스는 비동기 관계, 기본 과정이 때 정지하는 즉시 자식 프로세스를 캡처 할 수 없습니다입니다

아이의 종료 후 즉시 메모리 리소스를 해제하는 경우, 메인 프로세스가 자식 프로세스의 상태를 모니터링 할 수있는 방법은 없습니다

위의 질문 유닉스는 메커니즘을 제공

모든 보조 공정의 종료 후, 즉시 작업 링크 해제 될 파일의 ​​데이터 메모리의 대부분이지만 일부 요소 유지할 것이다 : 프로세스 ID, 종료 시간, 메인 작업 상태 모니터링 프로세스를 대기는 재활용.

좀비 과정

기본 공정 재순환되기 전에 모든 보조 공정의 종료 후, 좀비 상태로 진입 할

피해 좀비 처리 여부

부모가 재활용 (대기 / waitpid를)위한하지 좀비 프로세스를 수행하는 경우, 프로세스 PID 번호를 복용 메모리를 차지할 좀비 프로세스를 많이 생성

좀비 프로세스를 해결하는 방법

부모 프로세스가 자식 프로세스의 다수를 생산하고 있지만이 좀비 프로세스의 다수를 형성하는 것이다, 복구, 솔루션 직접 부모 프로세스를 죽일 것입니다, 모든 좀비가 초기화에 의해 재활용 과정을 고아

고아

어떤 이유로 부모 프로세스는 끝났다, 그러나 당신의 자식 프로세스는 계속 실행되고, 그래서 당신의 부모 프로세스가 끝난 경우 자식 프로세스이 고아 프로세스는 모든 당신 고아 프로세스를 초기화하기됩니다 재활용 프로세스가 초기화가 부모가되고, 당신의 재활용

뮤텍스

프린터와 세 동료 및 인쇄.

세 동료 세 가지 공정 시뮬레이션, 시뮬레이션 플랫폼 프린터 출력.

뮤텍스 :

우리는 공정성 및 주문 데이터의 안전을 보장 할 수

# 版本一
from multiprocessing import Process
import time
import random
import os


def task1():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{os.getpid()}打印结束了")


def task2():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{os.getpid()}打印结束了")


def task3():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{os.getpid()}打印结束了")


if __name__ == '__main__':
    p1 = Process(target=task1)
    p2 = Process(target=task2)
    p3 = Process(target=task3)

    p1.start()
    p2.start()
    p3.start()

"""
188412开始打印了
188408开始打印了
188388开始打印了
188412打印结束了
188388打印结束了
188408打印结束了
"""

# 现在是所有的进程都并发的抢占打印机,
# 并发是以效率优先的, 但是目前我们的需求: 顺序优先
# 多个进程共抢一个资源时, 要保证顺序优先: 串行, 一个一个来
# 版本二
from multiprocessing import Process
import time
import random
import os


def task1():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{os.getpid()}打印结束了")


def task2():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{os.getpid()}打印结束了")


def task3():
    print(f"{os.getpid()}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{os.getpid()}打印结束了")


if __name__ == '__main__':
    p1 = Process(target=task1)
    p2 = Process(target=task2)
    p3 = Process(target=task3)

    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()

"""
160876开始打印了
160876打印结束了
188264开始打印了
188264打印结束了
188328开始打印了
188328打印结束了
"""

# 我们利用join, 解决串行的问题, 保证了顺序优先, 但是这个谁先谁后是固定的.
# 这样不合理, 你在争抢同一个资源的时候, 应该是先到先得, 保证公平
# 版本三
from multiprocessing import Process
from multiprocessing import Lock
import time
import random


def task1(p, lock):
    lock.acquire()
    print(f"{p}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{p}打印结束了")
    lock.release()

def task2(p, lock):
    lock.acquire()
    print(f"{p}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{p}打印结束了")
    lock.release()


def task3(p, lock):
    lock.acquire()
    print(f"{p}开始打印了")
    time.sleep(random.randint(1, 3))
    print(f"{p}打印结束了")
    lock.release()


if __name__ == '__main__':

    mutex = Lock()
    p1 = Process(target=task1, args=("p1", mutex))
    p2 = Process(target=task2, args=("p2", mutex))
    p3 = Process(target=task3, args=("p3", mutex))

    p1.start()
    p2.start()
    p3.start()

"""
p1开始打印了
p1打印结束了
p2开始打印了
p2打印结束了
p3开始打印了
p3打印结束了
"""

잠금 및 차이를 가입

공통의

순서 수 있도록 직렬에 의해 복잡하게 할 수

다른 점

절차를 설정 믿는다 참여, 공정성을 보장하기 위해 출격 할 수 잠금

프로세스 간의 통신

메모리에 레벨 프로세스는 격리되어 있지만 디스크 파일에

1. 파일 기반 통신

표를 잡기 위해 시스템을 설명하기 위해 사용

# 抢票系统
# 1. 先可以查票, 查询余票数.    并发
# 2. 进行购买, 向服务端发送请求, 服务端接收请求, 在后端将票数-1, 返回到前端           串行
from multiprocessing import Process
import json
import time
import os
import random


def search():
    time.sleep(random.randint(1, 3))   # 模拟网络延迟(查询环节)
    with open("ticket.json", "r", encoding="utf-8")as f:
        dic = json.load(f)
        print(f"{os.getpid()}查看了票数, 剩余{dic['count']}")


def paid():
    with open("ticket.json", "r", encoding="utf-8")as f:
        dic = json.load(f)
        if dic["count"] > 0:
            dic["count"] -= 1
            time.sleep(random.randint(1, 3))
            with open("ticket.json", "w",  encoding="utf-8")as f1:
                json.dump(dic, f1)
            print(f"{os.getpid()} 购买成功")


def task():
    search()
    paid()
    
if __name__ == '__main__':

    for i in range(6):
        p = Process(target=task)
        p.start()

# 当多个进程共抢一个数据时, 如果要保证数据的安全, 必须要串行.
# 要想让购买环节进行串行, 我们必须要加锁处理
from multiprocessing import Process
from multiprocessing import Lock
import json
import time
import os
import random


def search():
    time.sleep(random.randint(1, 3))
    with open("ticket.json", encoding="utf-8")as f:
        dic = json.load(f)
        print(f"{os.getpid()} 查看了票数, 剩余{dic['count']}")


def paid():
    with open("ticket.json", encoding="utf-8")as f:
        dic = json.load(f)
    if dic["count"] > 0:
        dic["count"] -= 1
        time.sleep(random.randint(1, 3))
        with open("ticket.json", "w", encoding="utf-8")as f1:
            json.dump(dic, f1)
        print(f"{os.getpid()}购买成功")


def task(lock):
    search()
    lock.acquire()
    paid()
    lock.release()

if __name__ == '__main__':
    mutex = Lock()
    for i in range(6):
        p = Process(target=task, args=(mutex,))
        p.start()
"""
203496 查看了票数, 剩余3
203512 查看了票数, 剩余3
203496购买成功
203504 查看了票数, 剩余2
203480 查看了票数, 剩余2
203488 查看了票数, 剩余2
203520 查看了票数, 剩余2
203512购买成功
203504购买成功
"""

# 当很多进程共抢一个资源(数据)时, 你要保证顺序(数据的安全), 一定要串行. 
# 互斥锁: 可以公平性的保证顺序以及数据的安全
# 基于文件的进程之间的通信:
        # 效率低
        # 自己加锁麻烦而且很容易出现死锁

2. 통신 큐에 근거

3. 연통관 기준

추천

출처www.cnblogs.com/beichen123/p/11391594.html