进程

1、什么是进程?

正在进行一个过程或者一个任务,而负责执行任务的是cpu;(单核和多道技术可以实现多个进程的并发执行)

2、进程与程序区别?

程序是一堆代码,而进程指程序运行的过程,(同一个程序执行两次也是两个进程)

3、进程创建

新进程的创建时由一个人已经存在的进程执行了一个用于创建进程的系统调用而创建的;

关于创建的子进程,UNIX和windows

  (1)相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。

  (2)不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程与子进程的地址空间就是不同的。

4、进程的层次结构

无论UNIX还是windows,进程只有一个父进程,不同的是:

  (1) 在UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。

  (2)在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了。

5、进程的状态

运行态:一个程序正在被cpu执行;

阻塞态:遇到IO操作;

就绪态:IO执行完毕,等待CPU

 

6、开启进程的两种方式

方式一:

from  multiprocessing import Process
import time
def task(x): #创建的子进程
print('%s is running' %x)
time.sleep(3)
print('%s is done' %x)
if __name__ == '__main__': #当前文件是执行文件才会执行,如果是导入模块自己不会执行
p= Process(target= task,args=('子进程',))#括号内是一个参数要加逗号,调用类产生对象
#p = Process(target=task,kwargs= {'x':'子进程'})
p.start() #只是在向操作系统发送一个开启子进程的信号,开启子进程需要申请内存空间,把父进程的数据拷贝一份
print('主')

方式二:

from  multiprocessing import Process
import time
class Myprocess(Process): #创建自己的类,继承Process功能
def __init__(self,x): #初始化进程属性,进程名
super().__init__() #调用父类属性
self.name=x
def run(self): #子进程要执行的任务在run方法内
print('%s is running' % self.name) #self.name 内置方法,进程的名字
time.sleep(3)
print('%s is done' %self.name)
if __name__ == '__main__':
p= Myprocess('子进程1')
p.start() #调用函数run
print('主')

 

7、进程间内存空间隔离

from multiprocessing import Process
import os
import time
#改变子进程中的变量,看父进程中是否改变
x= 100
def task():
global x #把父进程的变量申明为局部变量,改值
x= 0
print('done',x)
if __name__ == '__main__':
p= Process(target=task)
p.start() #向操作系统发起开启子进程的信号
time.sleep(5) #让父进程等待,等到子进程运行完毕后才执行下一行代码
print(x)
#结果:done 0
# 100

8、进程对象的方法及相关属性

(1)join  当前代码执行完毕后执行下面代码

from multiprocessing import Process
import time
def task(name):
print('%s is running'%name)
time.sleep(3)
print('%s is done'%name)
if __name__ == '__main__':
p=Process(target=task,args=('子进程1',))
p.start()
p.join() # 让父进程在原地等待,等到子进程运行完毕后,才执行下一行代码
print('主')

多进程下应用:

from multiprocessing import Process
import time
def task(name,n):
print('%s is running' % name)
time.sleep(n)
print('%s is done' % name)
if __name__ == '__main__':
p_1= []
start_time= time.time()
for i in range(1,4):
p= Process(target=task,args=('子进程%s' %i,i))
p_1.append(p) #把进程对象加到列表
p.start() # 向操作系统发起开启子进程的信号
for p in p_1 :
p.join()
stop_time= time.time()
print('主',stop_time-start_time)

(2)pid 及ppid 当前进程ID 父进程ID
例题:
from multiprocessing import Process
import time
import os
def task(n):
print('%s is running'%os.getpid()) #在子进程内查看自己的ID
time.sleep(n)
print('%s is done'%os.getpid())
if __name__ == '__main__':
p = Process(target= task,args= (222,))
p.start()
print(p.pid)
print('主',os.getpid()) #主进程ID
#在cmd 查看进程命令tasklist |findstr python或者进程ID号
#终止进程tasklill /F /PID 进程ID号

例题:
from multiprocessing import Process
import time
import os
def task():
print('自己的id:%s 父进程的id:%s'%(os.getpid(),os.getppid()))
time.sleep(2)
if __name__ == '__main__':
p= Process(target=task)
p.start()
print('主',os.getpid(),os.getppid())#父进程及创建父进程的进程ID
(3)查看进程名  终止进程 判断子进程是否存活
from  multiprocessing import Process,current_process
import time
def task():
print('子进程[%s]运行。。'%current_process().name)#在子进程内查看子进程名
time.sleep(200)

if __name__ == '__main__':
p1= Process(target=task,name='子进程1')
p1.start()
p1.terminate() #向操作系统发起终止进程的信号 中间加个join或者tima.sleep 子进程状态就为FALSE
#p1.join()
print(p1.is_alive())#子进程是否活着
#print(p1.name)
print('主')

















 

posted @ 2018-07-11 19:59  朝朝哥  阅读(271)  评论(0编辑  收藏  举报