一、进程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程是线程的容器,一个进程可以有多个线程
进程特征
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行。
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
二、python多进程
创建多进程的两种方式:
- 调用multiprocessing.Process模块
- 重写multiprocessing.Process类的run方法
1、调用multiprocessing.Process模块创建进程
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
强调:
- 需要使用关键字的方式来指定参数
- args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍
1 group参数未使用,值始终为None
2 target表示调用对象,即子进程要执行的任务
3 args表示调用对象的位置参数元组,args=('liang',)
4 kwargs表示调用对象的字典,kwargs={'name':'anne','age':18}
5 name为子进程的名称
from multiprocessing import Process
def work1(name):
for i in range(4):
time.sleep(1)
print(f'{name}浇花的第{i + 1}秒')
def work2(name):
for i in range(3):
time.sleep(1)
print(f'{name}打墙的第{i + 1}秒')
if __name__ == '__main__':
p1 = Process(target=work1, args=('liang',))
p2 = Process(target=work2, args=('小狼',))
p1.start()
p2.start()
p1.join()
p2.join()
print('主线程执行完毕')
#输出
liang浇花的第1秒
小狼打墙的第1秒
小狼打墙的第2秒
liang浇花的第2秒
liang浇花的第3秒
小狼打墙的第3秒
liang浇花的第4秒
主线程执行完毕
2、重写multiprocessing.Process类的run方法
将要执行的任务写入run方法,同样的任务可以多线程并行执行
import time
from multiprocessing import Process
class MyProcess(Process):
"""自定义的进程类"""
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
for i in range(3):
time.sleep(1)
print(f'{self.name}浇花的第{i + 1}秒')
if __name__ == '__main__':
q_list = []
for i in range(2): #创建4个线程并启动
p = MyProcess(f"liang{i}")
q_list.append(p)
p.start()
for q in q_list: #等待启动的线程执行结束
q.join()
print('主进程执行完毕')
#输出
liang0浇花的第1秒
liang1浇花的第1秒
liang0浇花的第2秒
liang1浇花的第2秒
liang0浇花的第3秒
liang1浇花的第3秒
主进程执行完毕
注意:
多进程 执行,必须在main函数下, if __name__ == '__main__':
三、多进程之间通讯
多进程之间所有资源都是独立的,不能共享全局变量
queue.Queue模块只能在一个进行中使用,可以实现一个进程中的多个线程相互通讯
多个进程之间的相互通讯,需要用到--multiprocessing.Queue:可以多个进程之间共用(通讯)
"""
进程之间通信:使用队列
multiprocessing.Queue:可以多个进程之间共用(通讯)
queue.Queue模块只能在一个进行中使用,一个进程中多个线程使用
"""
from multiprocessing import Process, Queue
def work1(q):
for i in range(5000):
n = q.get()
n += 1
q.put(n)
print("work1结束时候n的值:", n)
def work2(q):
for i in range(5000):
n = q.get()
n += 1
q.put(n)
print("work2结束时候n的值:", n)
if __name__ == '__main__':
q = Queue()
q.put(100)
p1 = Process(target=work1, args=(q,))
p2 = Process(target=work2, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
print('两个子进程执行结束之后,主进程打印的n:', q.get())
#输出
work2结束时候n的值: 10090
work1结束时候n的值: 10100
两个子进程执行结束之后,主进程打印的n: 10100
网友评论