如何开启多进程及多进程相关常用方法
什么是进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
2 进程的两种开启方法
(1) p = Process(target=None,args(,))
(2) 自定义类,继承Process父类
3 进程的常用方法
(1) start() 开启一个子进程
(2) join() 异步变同步(就是让父进程停留在join这句话,等待子进程执行结束,父进程再继续执行)
(3) is_alive() 判断进程是否活着
(4) terminate() 杀死进程
4 进程的常用属性
(1) p.name = 给p进程一个名字
(2) p.pid 返回p进程的pid
(3) p.daemon = True 将p进程设置为守护进程。(True为守护进程,False为普通进程)
守护进程的两个特点:
随着父进程的代码执行完毕才结束
守护进程不能创建子进程
守护进程必须要在start之前设置
并行: 指两者同时执行,比如有两条车道,在某一个时间点,两条车道上都有车在跑;(资源够用,比如三个线程,四核的CPU )
并发: 并发是指资源有限的情况下,两者交替轮流使用资源,比如只有一条车道(单核CPU资源),
那么就是A车先走,在某个时刻A车退出把道路让给B走,B走完继续给A ,交替使用,目的是提高效率。
同步: 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,
这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
异步: 不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,
只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。
阻塞, 非阻塞: 阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
开启子进程的方式:
# 先导入 multiprocessing中的Process
from multiprocessing import Process
import time
import os
def func1():
time.sleep(1)
# os.getpid() 获取当前进程的pid,os.getppid()获取当前进程的父进程的pid
print('子进程:子进程的pid是%s,子进程的父进程是%s' % (os.getpid(),os.getppid()))
if __name__ == '__main__':
p = Process(target=func1(),args=(1,))
p.start()
print('这里是父进程:父进程的pid是%s,父进程的父进程是%s' % (os.getpid(),os.getppid()))
进程的常用方法: terminate, is_alive
from multiprocessing import Process
import time
# p.is_alive() 判断进程是否存活
# p.terminate() 杀死p程序,让解释器告诉操作系统销毁p进程
def func1():
time.sleep(1)
print('子进程')
if __name__ == '__main__':
p = Process(target=func1(),)
p.start()
print('子进程状态状态:', p.is_alive())
p.terminate() # 杀死p进程,让解释器告诉操作系统销毁p进程
time.sleep(2)
print('子进程状态状态:',p.is_alive())
进程的常用方法: join方法 : 是让主进程等待子进程执行完
from multiprocessing import Process
import time
def func():
for i in range(500):
time.sleep(0.01)
print('儿子在这里')
if __name__ == '__main__':
p = Process(target=func)
p.start()
p.join()# 是让主进程等待子进程执行完。 现象:主进程执行到这句话,主进程阻塞住,等待子进程执行
# time.sleep(1)
for i in range(100):
time.sleep(0.01)
print('爸爸在这里')
# 开启一个正常的子进程,父进程会等待子进程结束后,父进程也就是程序才结束
# p.join()# 是让主进程等待子进程执行完。 现象:主进程执行到这句话,主进程阻塞住,等待子进程执行
# 如何把父进程和子进程之间的关系变为同步或者异步?
# 父进程执行join,就会变成同步,不执行join,父进程和子进程就是异步的关系
# join必须放在start()后边
进程常用属性: p.name p.pid p.daemon(守护进程)
from multiprocessing import Process
import os
def func():
print('这里是子进程,子进程的pid是%s' % (os.getpid))
if __name__ == '__main__':
p = Process(target=func())
p.start()
p.name = 'ben'
print('子进程的名字为%s' % p.name)
print('子进程的pid为%s' % p.pid)
print('子进程是否为守护进程,%s' % p.daemon)
多进程之间无法共享内存
from multiprocessing import Process
def func(i):
print('我是%s'%i)
# global n
print(n)
if __name__ == '__main__':
n = 100
addr = ['河南的','山东的','辽宁的','湖南的']
for i in addr:
p = Process(target=func,args=(i,))
p.start()

浙公网安备 33010602011771号