目录
多任务
多任务: 简单的说,就是操作系统可以同时进行多个任务。 多校CPU已经非常昔及了,但是,即使过去的单核CPU.也可以教行多任务,由于CPU执行代码都是顺序执行的。
操作系统轮流让各个任务交替执行,任务1执行.0秒,切换到任务2. 任务2执行0.01秒,再切换到任务3,执行0.01 ...这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。
真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。
进程
程序编写完没有运行称之为程序。正在运行的代码就是进程。在Python3语言中,对多进程支持的是mul tiprocessing模块和subprocess模块。multiprocessing 模块为在子进程中运行任务、通讯和共享数据,以及执行各种形式的同步提供支持。
进程创建
Python提供了非常好用的多进程包multiprocessing,只需要定义-一个函数,Python 会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multprocessing支持子进程、通信和共享数据。语法格式如下:
Process([group[,target[,name[,args[,kwargs]]]]])
创建子进程代码:
# 导入模块
from multiprocessing import Process
def run_test():
print("...test...")
if __name__=="__main__":
print("主进程执行")
# 创建子进程 target接收执行的任务
p=Process(target=run_test)
# 调用子进程
p.start()
其中target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。group参数未使用,值始终为None
创建子进程并进行传参代码:
# 导入模块
from multiprocessing import Process
from time import sleep
# 定义任务函数
def ren_test(name,age,**kwargs):
print("子进程正在进行 name的值:%s,age的值: %d"%(name,age))
print("字典kwargs:",kwargs)
if __name__=="__main__":
print("主进程开始执行")
# 创建子进程
p=Process(target=ren_test,args=("小明",19),kwargs={"key":12})
# 调用子进程
p.start()
常用方法
方法 | 描述 |
---|---|
is_alive() | 如果子进程仍然运行,返回True |
join() | 等待子进程终止。Timeout是可选的潮时,进程可以被链接无数次,但如果连接自身则会出错 |
run() | 启动时运行的方法。默认情况下,会调用传递给Process构造函数的target定义进程的另一种方法是继承Process类并重新实现run()函数 |
start() | 启动进程,这将运行代表进程的子进程,并调用该子进程中的run()函数 |
terminate() | 强制终止进程。如果调用此函数,子进程将被立即终止;同时不会进行任何清理动作。如果子进程创建了它自己的子进程,这些进程将变为僵尸进程。使用此方法时需要特别小心。如果子进程保存了一个锁或参与了进程间通信,那么终止它可能会导致死锁或I/0损坏 |
join使用方法:
# 导入模块
from multiprocessing import Process
from time import sleep
def worker(interval):
print("work start")
sleep(interval)
print("work end")
if __name__=="__main__":
print("主进程正在进行")
# 创建子进程
p=Process(target=worker,args=(3,))
p.start()
# 希望主进程可以在子进程结束之后在结束
p.join()
print("主进程执行结束")
join方法中timeout的使用方法:
# 导入模块
from multiprocessing import Process
from time import sleep
def worker(interval):
print("work start")
sleep(interval)
print("work end")
if __name__=="__main__":
print("主进程正在进行")
# 创建子进程
p=Process(target=worker,args=(1,))
p.start()
# timeout:等待子进程timeout秒,若timeout之后,子进程仍未结束,主进程将直接结束
p.join(3)
print("主进程执行结束")
Process属性
方法 | 描述 |
---|---|
name | 进程的名字 |
pid | 进程的整数进程ID |
Process的两个属性的使用:
# 导入模块
from multiprocessing import Process
from time import sleep
def worker(interval):
print("work start")
sleep(interval)
print("work end")
if __name__=="__main__":
print("主进程正在进行")
# 创建子进程
p=Process(target=worker,args=(1,))
p.start()
# timeout:等待子进程timeout秒,若timeout之后,子进程仍未结束,主进程将直接结束
p.join(3)
print("主进程执行结束")
创建多个任务
创建多任务:
# 导入模块
from multiprocessing import Process
from time import sleep
def work01(interval):
print("执行work01")
sleep(interval)
print("end work01")
def work02(interval):
print("执行work02")
sleep(interval)
print("end work02")
def work03(interval):
print("执行work03")
sleep(interval)
print("end work03")
if __name__=="__main__":
print("主进程开始执行")
# 创建子进程
p1=Process(target=work01,args=(4,))
p2=Process(target=work02,args=(2,))
p3=Process(target=work03,args=(3,))
# 调用子进程
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print("p1.name:",p1.name)
print("p2.name:",p2.name)
print("p3.name:",p3.name)
print("主进程执行完毕")