美文网首页
多进程知识点总结1

多进程知识点总结1

作者: 把早晨六点的太阳留给我 | 来源:发表于2018-07-09 19:18 被阅读0次
    1.fork函数

    此处需要注意的是

    当调用fork方法 ,之后的代码会运行两次
    os 中的fork只能在liunx中使用
    fork方法有一个返回值。若为0表示子进程
    获取子进程的编号 os.getpid 获取父进程的编号

    实例:

    """
    os 中的fork只能在liunx中使用
    """
    
    import os
    print("daima")
    # 运行一个子进程
    
    # 当调用fork方法 ,之后的代码会运行两次
    re = os.fork()
    print("res = ",re)
    # fork方法有一个返回值。若为0表示子进程
    if re == 0:
    # 获取子进程的编号 os.getpid  获取父进程的编号os.getppid
        print("子",os.getpid(),os.getppid())
    else:
        print("主",os.getpid())
    
    print("代码完成")
    ======================================================
    
    os.fork()
    os.getpid()
    os.getppid()
    
    2.全局变量问题

    全局变量不共享,进程独自占有一份

    实例:

    import os
    
    num = 10
    
    def sum1():
        print("111")
        global num
        num += 10
        print("unm")
    
    def sum2():
        print("22222")
        global num
        num += 10
        print(num)
    
    res = os.fork()
    if res == 0:
        print("子进程运行")
        sum1()
    
    else:
        print("主进程运行")
        sum2()
    
    print("程序运行结束")
    

    3.多个fork问题

    遇见fork将一个进程开辟成两个

    实例

    import os
    
    res = os.fork()
    if res == 0:
        print("1")
    else:
        print("2")
    
    res2 = os.fork()
    if res2 == 0:
        print("3")
    else:
        print("4")
    
    print("程序运行结束")
    

    运行结果


    image.png
    4.window环境下使用multiprocessing

    我们使用os.fork()方法实现了多进程,但是这种方案只能在Linux下运行,window环境下是无法运行的,那么有没有可以实现在任何平台都能运行的多进程了,有!Python为大家提供了multiprocessing模块用来实现多进程。

    multiprocessing模块实例:

    主进程不变,创建子进程
    from multiprocessing import Process
    import time
    import os
    
    def download(path):
        print("开始下载")
        for x in range(5):
            print("%s开始下载中……" %path)
            print(os.getpid())
            print(os.getppid())
            time.sleep(1)
        print("下载结束")
    
    def printMsg(msg):
        print("开始打印")
        for x in range(5):
            print("打印中……%s" % msg)
            print(os.getpid())
            print(os.getppid())
            time.sleep(1)
        print("打印结束")
    
    if __name__ == '__main__':
        start_time = time.time()
        print("程序开始运行了")
        # download("www.xxx.com")
        # 多进程
        # 构建进程对象
        t1 = Process(target=download, args=("www.xxx.com",), name="download")
    
        # 启动进程
        t1.start()
        # 构建进程对象
        t2 = Process(target=printMsg, args=("刘建宏真帅,今天天气真热!!",), name="print")
        # 启动进程
        t2.start()
    
        print("程序结束", time.time() - start_time)
    

    运行结果

    image.png
    5.多进程中常见方法

    启动进程

    t1.start()
    

    守护进程放在start之前 ,把这个进程注册成守护进行
    守护进程依赖于主进程存活,主进程结束守护进程结束

    t1.daemon = True
    

    获取进程名称.在多进程中,子进程名字默认是Process - n

    print(t1.name)
    

    判断进程是否被杀死

    if t1.is_alive():
        print(t1.is_alive())
    

    杀死进程

        t1.terminate()
    

    进程对象的join方法,使主进程等待当前子进程运行结束后再进行运行

    t1.join()
    

    综合实例:

    def run(msg):
        for x in range(10):
            print("一个子进程")
            print(msg)
            print("子进程结束")
            time.sleep(1)
    
    if __name__ == '__main__':
        print("主进程开始")
        t1 = Process(target=run, args="1", name="zi")
        t2 = Process(target=run, args="2", name="zi1")
    
        # 守护进程放在start之前 ,把这个进程注册成守护进行
        # 守护进程依赖于主进程存活,主进程结束守护进程结束
        t1.daemon = True
    
        # 启动进程
        t1.start()
        t2.start()
    
        # 获取进程名称
        # 在多进程中,子进程名字默认是Process - n
        print(t1.name)
        print(t2.name)
    
        # 判断进程是否被杀死
        if t1.is_alive():
            print(t1.is_alive())
            # 杀死进程
            t1.terminate()
    
        # 进程对象的join方法,使主进程等待当前
        # 子进程运行结束后再进行运行
        t1.join()
    
        print("zhu")
    
    6.进程类

    进程的实现:
    1.需要基础multiprocessing模块中Process类
    2.重写run方法,run方法就是我们要执行的方法

    from multiprocessing import Process
    import time
    """
    进程的实现:
         1.需要基础multiprocessing模块中Process类
         2.重写run方法,run方法就是我们要执行的方法
    """
    
    
    class MyProcess(Process):
    
        def __init__(self, name, age):
            # 第一个参数是进程的名字不能写成普通参数,固定写法
            super().__init__(name=name)
            self.age = age
    
    # RUN方法就是进程需要的执行的方法
        def run(self):
            print("独立子进程")
            time.sleep(1)
            print("子进程结束")
    
    if __name__ == '__main__':
        print("主进程开始")
        m1 = MyProcess("1", "2")
        m1.start()
        print("主进程结束")
    

    相关文章

      网友评论

          本文标题:多进程知识点总结1

          本文链接:https://www.haomeiwen.com/subject/ahgtpftx.html