• 进程的创建


    进程的创建

    进程创建的两种方式

    方式1(推荐)

    # from multiprocessing import Process
    #
    # def func():
    #     print(12345)
    #
    # if __name__ == '__main__': 
    #     p = Process(target=func,) 
    #     p.start() 
    #     print('*' * 10) 
    

    方式2(了解)

    class MyProcess(Process): 
        def __init__(self,person):
            super().__init__()
            self.person=person
        def run(self):
            print(os.getpid())
            print(self.pid)
            print(self.pid)
            print('%s 正在和女主播聊天' %self.person)
    
    if __name__ == '__main__':
        p1=MyProcess('Jedan')
        p2=MyProcess('大猿')
        p3=MyProcess('alexDSB')
    
        p1.start() 
        p2.start()
        # p2.run()
        p3.start()
    
    

    子进程和主进程

    我们通过主进程创建的子进程是异步执行的,那么我们就验证一下,并且看一下子进程和主进程(也就是父进程)的ID号(讲一下pid和ppid,使用pycharm举例),来看看是否是父子关系。

    import time
    import os
    
    #os.getpid()  获取自己进程的ID号
    #os.getppid() 获取自己进程的父进程的ID号
    
    from multiprocessing import Process
    
    def func():
        print('aaaa')
        time.sleep(1)
        print('子进程>>',os.getpid())
        print('该子进程的父进程>>',os.getppid())
        print(12345)
    
    if __name__ == '__main__': 
        #首先我运行当前这个文件,运行的这个文件的程序,那么就产生了主进程
    
        p = Process(target=func,) 
        p.start() 
        print('*' * 10) 
        print('父进程>>',os.getpid())
        print('父进程的父进程>>',os.getppid())
    
    

    结果

    #加上time和进程号给大家看一看结果:
    #********** 首先打印出来了出进程的程序,然后打印的是子进程的,也就是子进程是异步执行的,相当于主进程和子进程同时运行着,如果是同步的话,我们先执行的是func(),然后再打印主进程最后的10个*号。
    #父进程>> 3308
    #父进程的父进程>> 5916 #我运行的test.py文件的父进程号,它是pycharm的进程号
    
    #aaaa
    #子进程>> 4536
    #该子进程的父进程>> 3308 #是我主进程的ID号,说明主进程为它的父进程
    
    #12345
    

    进程之间是空间隔离的

    进程之间的数据是隔离的,也就是数据不共享

    from multiprocessing import Process
    n=100 #全局变量
    def work():
        global n
        n=0
        print('子进程内: ',n)
    
    if __name__ == '__main__':
        p=Process(target=work)
        p.start()
        p.join() 
        print('主进程内: ',n)
    

    结果

    #看结果:
    # 子进程内:  0
    # 主进程内:  100
    

    进程对象的其他方法

    name和pid的用法

    from multiprocessing import Process
    import time
    import random
    class Piao(Process):
        def __init__(self,name):
            #为我们开启的进程设置名字的做法
            super().__init__()
            self.name=name
    
        def run(self):
            print('%s is piaoing' %self.name)
            time.sleep(random.randrange(1,3))
            print('%s is piao end' %self.name)
    
    p=Piao('egon')
    p.start()
    print('开始')
    print(p.pid) #查看pid
    

    守护进程

    前我们讲的子进程是不会随着主进程的结束而结束,子进程全部执行完之后,程序才结束,那么如果有一天我们的需求是我的主进程结束了,由我主进程创建的那些子进程必须跟着结束,怎么办?守护进程就来了!

    主进程创建守护进程

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

    • 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

      注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止

    看示例代码

    import os
    import time
    from multiprocessing import Process
    
    class Myprocess(Process):
        def __init__(self,person):
            super().__init__()
            self.person = person
        def run(self):
            print(os.getpid(),self.name)
            print('%s正在和女主播聊天' %self.person)
            time.sleep(3)
    if __name__ == '__main__':
        p=Myprocess('大猿')
        p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
        p.start()
        # time.sleep(1) # 在sleep时linux下查看进程id对应的进程ps -ef|grep id
        print('主')
    

    课堂练习(requests模块讲解一下)

    通过多进程完成多个网站的爬取,使用request模块
    url_list = ['https://www.baidu.com','https://www.jd.com','https://www.taobao.com']
    
    
  • 相关阅读:
    c# in deep 之LINQ简介(1)
    今天开通博客
    bzoj 4009 接水果 整体二分
    区间求mex的几种方法
    充分性,必要性,充分条件,必要条件的区别
    表达式求值(noip2015等价表达式)
    selenium-模拟鼠标
    selenium学习-ActionChains方法列表
    高手指导中手的书籍
    新生
  • 原文地址:https://www.cnblogs.com/zhufanyu/p/12106886.html
Copyright © 2020-2023  润新知