赞
踩
进程(Process)是计算机中的程序关于某数据 集合上的一次运行活动,是系统进行资源分配的基本单 位。
多个进程同时执行时,每个进程的执行都需要由操作系 统按一定的算法(RR调度、优先数调度算法等)分配 内存空间。
进程控制块PCB、数据段、正文段
就绪状态、运行状态和阻塞状
用户创建出来的所有进程都是由操作系统负责,新进程的创建都是由一个已经存在的进程执 行了一个用于创建进程的系统调用而创建的 Linux中pid为0的进程,是所有进程的主进程
在python中,每一个运行的程序都有一个主进程,可以利用模块中封装的方法来创建子进程 (os.fork =>linux、multiprocessing)
os.fork就是用来创建子进程的方法,os.fork中就用来创建子进程的方法
import os,time print("start...") pid = os.fork() #父进程运行时得到的pid为子进程的pid,子进程运行时这个pid就是0 print("outerside pid is:",pid) if pid == 0: print("child process") time.sleep(60) print("child pid is:",os.getpid()) print("child-parent pid is:",os.getpid()) else: print("parent process") time.sleep(60) print("parent pid is:",os.getpid())
父进程退出,子进程还在运行,那么这个子进程就会成为孤儿进程,孤儿进程会被怕pid为1 的进程收养
[root@Hardy 8_10]# ps -ef|grep python3
root 1679 1 0 15:12 pts/0 00:00:00 python3 process1.py
root 1685 1545 0 15:13 pts/1 00:00:00 grep --color=auto python3
子进程退出,父进程没有响应。父进程没有调用wait()或者waitpid去获取子进程的状态,子进程的进程控制块就会依然保存在系统中国,这种进程就称之为僵尸进程
[root@Hardy 8_10]# ps aux|grep python3
root 1663 0.0 0.3 124932 5692 pts/0 S+ 15:06 0:00 python process1.py
root 1664 0.0 0.0 0 0 pts/0 Z+ 15:06 0:00 [python3] <defunct>
root 1666 0.0 0.0 112824 976 pts/1 S+ 15:06 0:00 grep --color=auto python3
Multiprocessing 由于windows没有fork调用,python提供了multiprocessing支持跨平台版本。
构造方法:Process([group [, target [, name [, args [, kwargs]]]]])
实例方法:
import multiprocessing from multiprocessing import Process,current_process import time lst = [] def task(i): print(current_process().name,i,'start...') time.sleep(2) lst.append(i) print(lst) print(current_process().name,i,'end....') if __name__ == "__main__": p_lst = [] for i in range(4): p = Process(target = task,args = (i,)) #只能在程序入口创建多进程 p_lst.append(p) p.start() print("st") for p in p_lst: p.join() print("main end....") # class Myprocess(multiprocessing.Process): # def __init__(self,num): # super(Myprocess,self).__init__() # self.num = num # def run(self): # print(current_process().name) # print(f"running on process:{self.num}") # # if __name__ == "__main__": # t1 = Myprocess(1) # t2 = Myprocess(2) # t1.start() # t2.start()
不同进程间内存是不共享的,multiprocessing中提供以下方式实现进程间的数据交换
from multiprocessing import Manager,Process,Lock import time def func(i,temp): with lock: time.sleep(1) temp[0] += 100 # time.sleep(1) print(i,"-------->",temp[0]) #使用manager 父进程要等待子进程结束再退出 lock = Lock() if __name__ == "__main__": manager = Manager() temp = manager.list([1,2,3]) p_list = [] for i in range(10): p = Process(target=func,args=(i,temp)) p.start() p_list.append(p) for i in p_list: i.join() #不加join,manager进程会先退出,子进程就访问不到manager共享的数据了
#队列
from multiprocessing import Process,Queue
import time
def func(i,q):
if not q.empty():
print(i,"----->get value,",q.get())
time.sleep(2)
#先进先出
if __name__ == "__main__":
q = Queue() #不能用在进程池
for i in range(6):
q.put(10-i)
p = Process(target=func,args=(i,q))
p.start()
一般我们是通过动态创建子进程(或子线程)来实现并发服务器的,但是会存在这样一些缺点:
构造方法
实例方法
注意:
① 使用Pool创建进程池对象,同时进程池中进程已经启动
② 向进程池对象中添加事件,事件排队执行
③ 如果主进程退出,则进程池中所有进程都退出
from multiprocessing import Pool,current_process import time lst = [] def task(i): print(current_process().name,i,'start...') time.sleep(2) lst.append(i) print(lst) print(current_process().name,i,'end....') if __name__ == "__main__": #创建一个进程池,建议进程数和cpu核数一致即可,也可也等于alter,cpu几核就几个 #maxtasksperchild=3,每个work进程最多只能处理三个任务,执行完就挂了 #释放内存空间 p = Pool(processes=4,maxtasksperchild=3) # time.sleep(100) for i in range(20): #进程池接受任务 p.apply_async(func=task,args=(i,)) #关闭进程池,不接受新任务,已经创建的任务会继续运行 p.close() #等待子进程执行完毕,父进程再执行 p.join() print("end...........")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。