zoukankan      html  css  js  c++  java
  • 第一阶段:Python开发基础 day36 并发编程之Process的join用法和其他用法

    上节课内容回顾

    '''
    操作系统
    *****
    串行:一个完完整整执行完再
    并发:看起来是同时运行 单核
    并行:真正的同时运行
    
    多道技术:
    空间复用:共用一个内存条,多个进程互相隔离,物理级别隔离。
    时间复用:共用一个cpu
    
    *****
    程序:躺在硬盘上的文件
    进程:一个执行的程序,是一系列资源的总和
    如何再我们的程序里开子进程。
    
    
    # 尽量减少阻塞状态可以提升我们程序运行的效率
    *****
    并发 = 保存状态+切换
    
    '''
    # *****
    # 开子进程  申请新的内存空间 把父进程的所有代码完整拷贝一份过去
    # from multiprocessing import Process
    #
    # def task(x):
    #     pass
    #
    # if __name__ == '__main__':
    #     p = Process(target=task,args=(45,))
    #     p.start()
    
    # 第二种开启子进程的方式不常用
    # from multiprocessing import Process
    #
    #
    # class Xx(Process):
    #     def __init__(self,x):
    #         super().__init__()
    #         self.x = x
    #     def run(self):
    #         pass
    #
    #
    # p = Xx()
    # p.start()
    
    # 验证内存空间彼此隔离
    
    # 僵尸进程:父进程的子进程结束的时候父进程没有wait()情况下子进程会变成僵尸进程。
    
    #*****
    # 父进程等着所有的子进程结束才会结束。
    
    ################################### 今日内容#######################
    # 孤儿进程(无害) *
    # 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
    
    '''
    情况1  无害
    父进等着子进程都死,回收僵尸进程。
    
    情况2  无害
    父进程死了,子进程活着,都要被init进程接管并且回收。
    
    情况3
    父进程一直不死,造成了大量僵尸进程。占用了大量的pid号
    
    pid号是有限的。
    解决方案:
    最直接的办法就是杀死父进程 。
    
    
    '''
    
    # join的用法 *****
    
    # Process的其他小用法 *
    # 掌握pid 和 ppid的查看方式  *****
    # 守护进程
    # 抢票小程序
    # Queue
    

    一、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('主')
    

    二、Process的其他用法

    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的terminal(了解)

    from  multiprocessing import Process,current_process
    import time
    def foo():
        print('进程 start')
        # print('---------------------    ',current_process().name)
        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(5)
        print('守护进程 end')
    
    
    
    if __name__ == '__main__':
        p = Process(target=foo)
        p.daemon = True # 把这个子进程定义为了守护进程
        p.start()
        time.sleep(2)
        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)
                print(f'进程{os.getpid()} 抢票成功')
            time.sleep(1.5) # 模拟网络io
        else:
            print('票已经售空啦!!!!!!!!!!!')
    
    def task():
        search()
        get()
    
    if __name__ == '__main__':
        for i in range(15):
            p = Process(target=task)
            p.start()
            p.join()
    
    
    # 为了保证数据的安全,要牺牲掉效率.
    
  • 相关阅读:
    compiere简易介绍及个人看法
    js数字金额转换为英文金额(数字的中英文转化) 修正版
    eval和document.getElementById
    关于netsuite编辑单据页面默认打开某tab的办法
    js 抛出异常 throw
    Training Agenda netsuite
    js 多维数组 应用
    AJAX提交数据时 中文处理 以及js url 中文处理
    监视所有 HTTP 请求和响应的工具 Fiddler工具介绍 (转载)
    关于netsuite创建组合按钮的方法,合并按钮,netsuite API
  • 原文地址:https://www.cnblogs.com/foreversun92/p/11535395.html
Copyright © 2011-2022 走看看