进程:一段程序运行起来后,系统会分配一定的资源给到这段程序,这段程序代码+分配到的资源,我们年称之为进程。
进程的状态:分为就绪、运行、等待三种状态。
就绪态:运行的条件都已经满足,正在等待cpu执行
运行态:cpu正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待状态
进程与线程一样,也是用来实现多任务的一种方式。
实现进程:
import multiprocessing
“函数1”
“函数2”
def main():
p1 = multiprocessing.Process(target=函数1,args=(,))
p2 = multiprocessing.Process(target=函数2,args=(,))
p1.start()
p2.start()
······
进程实现多任务的代码几乎与线程一样,只是模块名发生了改变,其他的参照线程即可。
在linux系统中,可通过终端命令查看系统正在运行的进程。
查看进程:
$ps -aux
结束进程:
$kil 进程PID
进程与线程:
1.可以实现多任务
2.先有进程,再有线程
3.一个进程中至少有一个主线程,反之亦然
4.线程是进程里面的多任务,即一段代码得到运行,分配了一定的资源,实现进程,再由线程去执行
5.线程不能独立运行,必须依存在进程中
通俗点说,进程是资源分配的单位,进程是操作系统调度的单位。它们之间的关系就好比电脑上运行的QQ,运行一个QQ就是一个进程,多个QQ就是多个进程,而QQ里面执行的如发送消息,接收消息,下载文件等命令就是线程。
实现进程间数据通信—Queue队列:遵循先进先出原则
创建Queue队列:
import multiprocessing
q = multiprocessing.Queue(3) # 创建一个Queue队列对象,这个队列中最多允许放入3个数据
q.put(数据) # 在队列中放入数据
q.get() # 从队列中提取数据,提取数据遵循先进先出原则
if q.pull(): # 判断队列是否存满
if q.empty(): # 判断队列是否空了
注:Queue队列常用来解耦合。
进程池Pool:
创建进程池:
import multiprocessing
po = multiprocessing.Pool(3) # 创建进程池对象,这个进程池中最多允许的进程数为3
每次循环将会用空闲出来的子进程去调用目标
po.apply_async(函数名,args) # Pool().apply_async(要调用的函数,(传递给目标的参数元组,))
po.close() # 关闭进程池,关闭后,进程池将不再接受新的请求
po.join() # 等待进程池中所有子进程结束,必须放在close()语句后面