对python进程的介绍,对进程的实现、进程间的关系、进程池、进程间通信。
多任务:
什么叫多任务:
操作系统可以同时运行多个任务,现代的操作系统比如Windows、Mac OS X、Linux、Unix等都是支持多任务的系统
为什么要实现多任务:
想效率高,不卡顿
实现多任务的方式
1、多进程模式:启动多个进程,每个进程虽然只有一个线程,但是多个进程可以一起执行多个任务
2、多线程模式:启动一个进程,在一个进程的内部启动多个线程,这样多个线程也可以一起执行多个任务
3、多进程+多线程:启动多个进程,每个进程再启动多个线程
4、协程
5、多进程+协程
进程:
什么是进程:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体
对于操作系统来说,一个任务就是一个进程。比方说打开浏览器就是启动一个浏览器的进程,在打开一个记事本就启动一个记事本进程,如果打开两个记事本就启动两个记事本进程。
进程的实现:
from multiprocessing import Process
from time import sleep
multiprocessing模块
1、跨平台的多进程模块
2、提供了一个Process类代表一个进程对象
def run(name, description):
while True:
print("%s is a %s man!"%(name, description))
sleep(1)
if __name__ == "__main__":
#程序启动的进程称为主进程(父进程)
#创建进程(子进程)
p = Process(target=run, args=("sunck", "handsome"))
#启动子进程
p.start()
while True:
print("kaige is a nice man")
sleep(1.2)
进程之间的关系:
from multiprocessing import Process
from time import sleep
def run():
print("启动子进程")
sleep(3)
print("结束子进程")
def run2():
print("启动子进程2")
sleep(3)
print("结束子进程2")
if __name__ == "__main__":
print("启动主进程")
p = Process(target=run)
p.start()
p2 = Process(target=run2)
p2.start()
#主进程的结束不能影响子进程,随意可以等待子进程结束在结束主进程
#等待子进程结束,才能继续执行主进程
#后期主进程主要做的是调度相关的工作,不具体负责业务逻辑
p.join()
p2.join()
print("结束主进程")
启动大量进程:进程池
import os
import time
import random
from multiprocessing import Process, Pool
def run(name):
# os.getpid()获取当前进程的进程ID
print("子进程%s启动--%s"%(name, os.getpid()))
t1 = time.time()
time.sleep(random.random()*5)
t2 = time.time()
print("子进程%s结束--%s--耗时%.2f" % (name, os.getpid(), t2-t1))
if __name__ == "__main__":
print("启动父进程")
#进程池
#表示可以同时执行的进程数量
#由于Pool的默认值为CPU的核心数量,如果有4个核心,则至少需要子进程才能看到等待的效果
pool = Pool(4)
for i in range(3):
# 创建进程放入进程池中统一管理
pool.apply_async(run, args=(i,))
# 进程池对象调用join之前必须先调用close,调用close之后就不能向进程池中添加进程了
pool.close()
#Pool对象调用join方法,会等待所有子进程结束再执行主进程
pool.join()
print("结束父进程")
进程间通信:
有名管道
无名管道
队列
共享内存
信号
信号量
from multiprocessing import Process, Queue
import time
import random
def produce(q):
print("启动produce子进程……")
time.sleep(5)
for value in ["good", "nice", "cool", "handsome"]:
print("将%s放入队列"%value)
q.put(value)
time.sleep(random.random())
print("结束produce子进程……")
def customer(q):
print("启动customer子进程……")
while True:
print("消费者等待数据")
value = q.get(True)
print("消费者消费%s条数据"%value)
print("结束customer子进程……")
if __name__ == "__main__":
q = Queue()
pro = Process(target=produce, args=(q,))
cus = Process(target=customer, args=(q,))
pro.start()
cus.start()
pro.join()
#cus进程里是死循环,无法等待它的结束,只能强制结束该子进程
cus.terminate()
print("END")