zoukankan      html  css  js  c++  java
  • day 36 process模块的join、pid、name、is_alive、terminate方法,守护进程,抢票程序

    process的join法

    from multiprocessing import Process
    import time
    def foo():
    print('进程 start ')
    time.sleep(2.3)
    print('进程 end ')

    if __name__ == '__main__':
    p = Process(target=foo)
    p.start() #
    # 核心需求就是
    # time.sleep(5)
    p.join() # 阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait())
    print('主')


    from multiprocessing import Process
    import time
    def foo(x):
    print('进程 start ')
    time.sleep(x)
    print('进程 end ')



    if __name__ == '__main__':
    p1 = Process(target=foo,args=(1,))
    p2 = Process(target=foo,args=(2,))
    p3 = Process(target=foo,args=(3,))
    start = time.time()
    p1.start() #
    p2.start() #
    p3.start() #
    # 核心需求就是
    # time.sleep(5)
    p3.join() #1s
    p1.join() #1s
    p2.join() #1s
    # 总时长:按照最长的时间计算多一点。
    end = time.time()
    print(end-start) #3s多 or 6s多 ? 正解:3s多
    print('主')


    from multiprocessing import Process
    import time
    def foo(x):
    print(f'进程{x} start ')
    time.sleep(x)
    print(f'进程{x} end ')



    if __name__ == '__main__':
    p1 = Process(target=foo,args=(1,))
    p2 = Process(target=foo,args=(2,))
    p3 = Process(target=foo,args=(3,))
    start = time.time()
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    # 相当于串行,不如不开,直接穿行调用函数反而快
    end = time.time()
    print(end-start)
    print('主')


    process的pid用法
    from multiprocessing import Process,current_process
    import time,os

    def task():

    print('子进程 start')
    print('在子进程中查看自己的pid',current_process().pid) # 在子进程中查看自己的pid
    print('在子进程中查看父进程的pid',os.getppid()) #
    time.sleep(200)
    print('子进程 end')

    if __name__ == '__main__':

    p = Process(target=task)
    p.start()
    print('在主进程查看子进程的pid',p.pid) # 一定要写在 start()之后
    print('主进程的pid',os.getpid())
    print('主进程的父进程pid',os.getppid())
    print('主')

    # 记住这些就ok了 这个是要掌握的
    # 角度 站在当前进程的角度
    os.getpid()#获取当前进程的pid
    os.getppid() #获取当前进程的父进程的pid
    子进程对象.pid #获取当前进程的子进程pid


    process的name和is_alive用法
    from  multiprocessing import Process,current_process
    import time
    def foo():
    print('进程 start')
    # print('--------------------- ',current_process().name)
    time.sleep(2)
    print('进程 end')


    if __name__ == '__main__':
    p = Process(target=foo)
    # p2 = Process(target=foo)
    # p3 = Process(target=foo,name='rocky')

    p.start()
    # p2.start()
    # p3.start()
    print(p.is_alive()) # True
    time.sleep(5)
    print(p.is_alive()) # 代码运行完了就算死了 False
    # print(p.name)
    # print(p2.name)
    # print(p3.name)
    print('主')


    process的terminate用法
    from  multiprocessing import Process,current_process
    import time
    def foo():
    print('进程 start')
    time.sleep(50)
    print('进程 end')


    if __name__ == '__main__':
    p = Process(target=foo)


    p.start()
    p.terminate() # 给操作系统发了一个请求
    print(p.is_alive()) # True
    p.join()
    print(p.is_alive()) # False
    print('主')


    
    
    守护进程
    '''
    守护进程
    守护--》伴随
    本质也是一个子进程
    主进程的代码执行完毕守护进程直接结束。
    '''

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

    def task():
    print('子进程 start')
    time.sleep(5)
    print('子进程 end')


    if __name__ == '__main__':
    p = Process(target=foo)
    p2 = Process(target=task)
    p.daemon = True # 把这个子进程定义为了守护进程
    p.start()
    p2.start()
    time.sleep(1)
    print('主')


    模拟抢票小程序

    from  multiprocessing import Process
    import json,time,os

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

    def get():
    with open('db.txt',mode='rt',encoding='utf-8') as f:
    res = json.load(f)
    # print(f'还剩{res["count"]}')
    time.sleep(1) # 模拟网络io
    if res['count'] > 0:
    res['count'] -= 1
    with open('db.txt',mode='wt',encoding='utf-8') as f:
    json.dump(res,f)
    time.sleep(1.5) # 模拟网络io
    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()


    # 为了保证数据的安全,要牺牲掉效率.以此例来说,一次只能进行一次抢票进程
     



     
  • 相关阅读:
    LDAP安装配置(windows)
    chrome postman插件手动安装
    mabatis insert into on duplicate key
    ZOJ 3641 <并查集+STL>
    ZOJ 3633 <rmq 重点在于转化>
    POJ 2817 状态DP 字符串找最多的重复
    POJ 2771 简单二分图匹配
    POJ 1149 最大流<建图> PIGS
    POJ 3692 二分图最大独立点集
    POJ 2239 简单的二分图求最大匹配
  • 原文地址:https://www.cnblogs.com/wwei4332/p/11513006.html
Copyright © 2011-2022 走看看