多任务编程
1.多任务进程
import multiprocessing # 导入多进程包
import time # time包作用是停顿等待,显示多任务在共同执行
# 跳舞任务
def dance():
for i in range(5):
print("跳舞中...")
time.sleep(0.2) # 停顿0.2s
# 唱歌任务
def sing():
for i in range(5):
print("唱歌中...")
time.sleep(0.2)
if __name__ == '__main__':
# 创建跳舞的子进程
# group: 表示进程组,目前只能使用None
# target: 表示执行的目标任务名(函数名、方法名)
# name: 进程名称, 默认是Process-1, .....
dance_process = multiprocessing.Process(target=dance, name="myprocess1")
sing_process = multiprocessing.Process(target=sing)
# 启动子进程执行对应的任务
dance_process.start() # 启动子进程
sing_process.start() # 启动子进程
执行结果展示:
2.获取进程编号
注意:需要导入os包
os.getpid() 打印当前进程编号
multiprocessing.current_process() 获取当前进程名字
os.getppid() 获取当前进程的父进程
# 获取当前的进程编号
import multiprocessing # 导入进程包
import os # 导入os包(os包是一个内置包,主要负责新建文件、改文件名、路径、操作电脑系统相关的功能。)
import time
# work1函数
def work1():
print("work1的当前编号:",os.getpid()) # 打印当前进程编号
print("work1的名字:",multiprocessing.current_process()) # 获取当前进程名字
print("work1的父进程是:",os.getppid()) # 获取work1的父进程
for i in range(5):
print("1正在工作中。。。")
#time.sleep(0.2)
# work2()函数
def work2():
print("work2",os.getpid())
print("work2:",multiprocessing.current_process())
print("work2的父进程是:",os.getppid())
for i in range(5):
print("2正在工作中。。。")
#time.sleep(0.2)
if __name__ == '__main__': # 主进程
print("main:",os.getppid()) # main函数的父进程是.py文件
# 创建work1子进程
work1_process = multiprocessing.Process(target = work1,name = "work1process")
# 创建work2子进程
work2_process = multiprocessing.Process(target = work2,)
# 启动子进程执行其任务
work1_process.start()
work2_process.start()
代码执行的结果为:
3.进程执行带有参数的任务
import multiprocessing
import time
# 带有参数的任务
def work(count,num):
for i in range(count,num): # [5:12)
print("正在工作中。。。")
time.sleep(0.2)
else:
print("任务执行完毕")
if __name__ == '__main__':
# 从创建子进程
work_process = multiprocessing.Process(target=work,kwargs = {"count":5,"num":12}) # kwargs是字典 args是元组 [5:12)
work_process.start()
代码执行的结果:
5.进程的注意点
进程中的全局变量不共享
import multiprocessing
import time
# 全局变量
g_list = []
# 带有参数的任务
def work(count,num):
for i in range(count,num):
g_list.append(i) # 添加到全局变量
print("结果:",i)
#time.sleep(0.2)
print("g_list:",g_list) # 读取最终的全局变量
def work2():
for i in range(10):
g_list.append(i)
print("结果2:",i)
#time.sleep(0.2)
print("read_data:",g_list) # 读取work2的最终全局变量
# 主进程
if __name__ == '__main__':
work_process = multiprocessing.Process(target=work,kwargs={"count":5,"num":20})
work2_process = multiprocessing.Process(target=work2)
work_process.daemon = True # daemon置为True 主线程不关心子线程运行状态,主线程退出,子线程也必须跟着退出。
work2_process.daemon = True
work_process.start()
work2_process.start()
# 守护主进程
# 主进程退出子进程销毁不再执行
# work_process.daemon = True
# work2_process.daemon = True
# 子进程销毁
#work_process.terminate()
#work2_process.terminate()
# 子进程执行结束
# 主进程执行完毕,延迟0.5s
time.sleep(1)
print("结束")
work_process.terminate()
work2_process.terminate()
exit()
代码执行的结果: