进程的创建
进程创建的两种方式
方式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']