zoukankan      html  css  js  c++  java
  • 并发编程5 操作系统&进程

    一.今日大纲

    1.multiprocessing模块简单应用

    2.for循环创建进程

    3.进程传参方式和创建方式2

    4.join方法

    5.操作系统基础

    二.今日内容

        (1)操作系统简单介绍
    多道技术:(超级重点)
    空间复用
    时间复用
    进程之间是空间隔离的
    分时系统
    实时系统
    通用操作系统(遇到io切换的会提高代码效率),

    并发:又称伪并发,看着像同时运行,其实是任务之间的切换(遇到IO切换的会提高代码效率)
    任务切换+保存状态(保存现场)
    并行:真正的同时在运行,应用的是多核技术(多个cpu)

    进程三状态:就绪(等待操作系统调度去cpu里面执行) 执行 阻塞

    提交任务的方式:同步异步
    任务的执行状态:阻塞非阻塞
    异步:任务的提交方式,多个任务提交出去,同时执行

    同步堵塞:
    异步堵塞:

    同步非堵塞:
    异步非堵塞:

    (这里是开启进程)

    (2)进程的两种创建方式
    Process(target=f1,args=(i,)) kwargs={'形参名为key':值}

    (3)
    #例子
    from multiprocessing import Process

    class MyProcess(Process): #继承
    def __init(self,n):
    super().__init__()
    self.n=n

    def run(self):
    pass
    if __name__='__main__':
    P=MyProcess(12)
    P.start()

    join方法:主进程等待子进程执行结束再继续执行
    没有join的话,先执行主进程中的内容
    for 循环开启进程
    三.详细内容
    (1)multiprocessing模块简单应用:
    #运行中的程序叫做进程
    import time
    time.sleep(1)
    print('123')
    #操作系统是大型软件
    #操作系统帮助我们调用硬件的

    重点代码&重点注释分析
    进程的创建方式1
    import time
    from multiprocessing import Process
    def f1():
        time.sleep(3)
        print('xxx')
    def f2():
        time.sleep(3)
        print('sss')
    #f1()
    #f2()
    #重点理解:windows系统下必须写main,因为windows系统创建子进程的方式决定的,开启一个子进程,
    # 这个子进程会copy一份主进程的所有代码,并且机制类似于import引入,这样就容易导致引入代码的时候,
    # 被引入的代码中的可执行程序被执行,导致递归开始进程,会报错
    if __name__=='__main__':
        p1=Process(target=f1,)  #子进程相当于copy主进程的内容一份
        p2=Process(target=f2,)
        p1.start()              #先调用主程序内的,再执行自己的并且,
                                # 所有start必须执行完,才可以执行,
        p2.start()
    
        time.sleep(3)  #仅限于我们的程序
        # p1.join()   #意思是子进程执行完才执行主进程
        # p2.join()
        print('我是主进程!!')
    
    '''
    不注释
    p1.join()
    p2.join():
    结果:
    xxx
    sss
    我是主进程!!
    
    注释
    p1.join()
    p2.join():
    结果:
    我是主进程!!
    xxx
    sss
    '''

    (2)for循环创建进程

    import time
    from multiprocessing import Process
    
    def f1(i):
        time.sleep(1)
        print(i)
    
    if __name__=='__main__':
    
        for i  in  range(20):
            p1=Process(target=f1,args=(i,))  #传参
            p1.start()

    注意:上边得到的结果是:0-19的20行数字,并且不是按照有序排列的

    (3)演示两种传参方式

    演示两种传参方式
    方式一:
    # import time
    # from multiprocessing import Process
    # def f1(i):
    #     time.sleep(3)
    #     print(i)
    # if __name__=='__main__':
    #         p1=Process(target=f1,args=('冬瓜与黄瓜',))  #传参
    #         p1.start()  #给操作系统发送一个创建进程的信号,后续进程的创建都是操作系统的事
    
    方式二
    # import time
    # from multiprocessing import Process
    #
    # def f1(i):
    #     time.sleep(3)
    #     print(i)
    # if __name__=='__main__':
    #     p1=Process(target=f1,kwargs={'i':'大牛'})  #传参//创建进程对象
    #     p1.start()  #给操作系统发送一个创建进程的信号,后续进程的创建都是操作系统的事

    案例:

    from multiprocessing import  Process
    class MyProcess(Process):
        def run(self):
            print('宝宝')
    if __name__=='__main__':
        p1=MyProcess()
        p1.start()

    (4)进程的创建方式2

    #传参:需要重新写一个init方法
    from multiprocessing import Process
    class MyProcess(Process):
        def __init__(self,n):
            super().__init__()  #先执行父类的方法
                                #别忘了执行父类的init
            ''''''
            '''
            没有上面的一句话,会报错,原因是下面,所以必须继承父类的参数
            assert self._popen is None, 'cannot start a process twice'
            AttributeError: 'MyProcess' object has no attribute '_popen'
            '''
            self.n=n        #自己定义的形式参数n
    
        def run(self):
            print('宝宝and%s不可告人的事情'%self.n)
    if __name__=='__main__':
        p1=MyProcess('搞忘')
        p1.start()

    (5)join方法

    import time
    from multiprocessing import Process
    def f1():
        time.sleep(2)
        print('xxxx')
    def f2():
        time.sleep(2)
        print('ssss')
    # f1()
    # f2()
    if __name__ == '__main__':
    
        p1 = Process(target=f1,)
        p1.start()
        p1.join()  # 主进程等待子进程运行完才继续执行
    
        print('开始p2拉')      #这个地方相当于主进程
    
        p2 = Process(target=f2,)
        p2.start()
        p2.join()
        print('我要等了...等我的子进程...')
        time.sleep(3)
        print('我是主进程!!!')
    
    '''
    如果把两个join()方法注释掉,结果是:
    开始p2拉
    我要等了...等我的子进程...
    xxxx
    ssss
    我是主进程!!!
    
    不注释的结果是:
    xxxx
    开始p2拉
    ssss
    我要等了...等我的子进程...
    我是主进程!!!


  • 相关阅读:
    Kubernetes日志的6个最佳实践
    如何选出适合自己的管理Helm Chart的最佳方式?
    授权权限服务设计解析
    微服务中如何设计一个权限授权服务
    微服务中的网关
    ketchup服务治理
    ketchup 消息队列rabbitmq使用
    ketchup 注册中心consul使用
    微服务框架 ketchup 介绍
    微服务框架surging学习之路——序列化
  • 原文地址:https://www.cnblogs.com/studybrother/p/10241727.html
Copyright © 2011-2022 走看看