概念
进程 = 代码 + 资源
一个程序运行起来就称之为进程,进程是一个拥有资源的(进程是一个资源分配的单位)
主进程死了,不影响子进程
知识点:
1、写时拷贝
代码实现
import multiprocessing
def test1():
while True:
print("1--------")
def test2():
while True:
print("2--------")
def main():
p1 = multiprocessing.Process(target=test1)
p2 = multiprocessing.Process(target=test2)
p1.start()
p2.start()
if __name__ == "__main__":
main()
子进程传参
import multiprocessing
import os
def test(a, b, c, *args, **kwargs):
print(a)
print(b)
print(c)
print(args)
print(kwargs)
def main():
print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid()))
p = multiprocessing.Process(target=test, args=(11, 22, 33, 44, 55, 66, 77, 88), kwargs={"mm":11})
p.start()
if __name__ == "__main__":
main()
进程间相互通信
1、文件 同电脑见的进程通信(基于硬盘)
2、队列 同电脑见的进程通信(基于内存)
3、socket 不同电脑间的进程通信 (基于网络)
4、redis
进程池Pool
进程池的使用
# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random
def worker(msg):
t_start = time.time()
print("%s开始执行,进程号为%d" % (msg,os.getpid()))
# random.random()随机生成0~1之间的浮点数
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start))
po = Pool(3) # 定义一个进程池,最大进程数3
for i in range(0,10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,))
print("----start----")
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")
使用进程池的说明
1、使用进程池开启多任务,进程池中的主进程不会等待子进程结束才结束,一定要使用po.join()
不然进程池中的任务不会执行
2、要使用等待子进程,必须先要关闭进程池po.close()
3、创建进程池的时候如果不指明最大数量,那么进程池的最大数量将根据系统的最大内存决定。