守护进程 守护进程 抢票小程序

会随着主进程的结束而结束。

主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

  其二:守护进程内无法再开启子进程,否则抛出异常:

'''
守护进程
守护--》伴随
本质也是一个子进程
主进程的代码执行完毕守护进程直接结束。
'''
from multiprocessing import Process
import time
def foo():
    print('守护进程 start')
    time.sleep(5)
    print('守护进程 end')
if __name__ == '__main__':

    p = Process(target=foo)
    p.daemon = True#一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
    p.start()
    time.sleep(2)# 把这个子进程定义为了守护进程
    print('主进程')
#############
守护进程 start
主进程

from multiprocessing import Process
import time


def foo():
    print('守护进程 start')
    time.sleep(3)
    print('守护进程 end')


def task():
    print('process start')
    time.sleep(5)
    print('process end')


if __name__ == '__main__':
    p = Process(target=foo)
    p2 = Process(target=task)
    p.daemon = True
    p.start()
    p2.start()
    time.sleep(1)
    print('主进程')
    
################
守护进程 start
process start
主进程
process end

抢票小程序

#db.txt
{"count": 10}
from multiprocessing import Process
import json
import os
import time


def search():
    time.sleep(1)  ##模拟网络IO
    with open('db.txt', mode='rt', encoding='utf8') as f:
        res = json.load(f)
        print(f'还剩余{res["count"]}')


def get():
    with open('db.txt', 'rt', encoding='utf8') as f:
        res = json.load(f)
    time.sleep(1)
    if res['count'] > 0:
        res['count'] -= 1
        with open('db.txt', 'wt', encoding='utf8') as f:
            json.dump(res, f)
            time.sleep(1.5)
            print(f'进程{os.getpid()}抢票成功')
    else:
        print("票已经成功售空!!!")


def task():
    search()
    get()


if __name__ == '__main__':
    for i in range(15):
        p = Process(target=task)
        p.start()
        p.join()
################
还剩余10
进程17808抢票成功
还剩余9
进程17504抢票成功
还剩余8
进程18052抢票成功
还剩余7
进程17620抢票成功
还剩余6
进程5480抢票成功
还剩余5
进程9372抢票成功
还剩余4
进程18108抢票成功
还剩余3
进程15816抢票成功
还剩余2
进程4644抢票成功
还剩余1
进程18044抢票成功
还剩余0
票已经成功售空!!!
还剩余0
票已经成功售空!!!
还剩余0
票已经成功售空!!!
还剩余0
票已经成功售空!!!
还剩余0
票已经成功售空!!!