进程的创建

进程的创建

进程创建的两种方式

方式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']

原文地址:https://www.cnblogs.com/zhufanyu/p/12106886.html