思路渐进目录
- 1、创建子进程
- 2、测试Process对象的相关方法
- 3、多进程执行顺序是不确定的
- 4、进程之间不共享全局数据
- 5、使用Queue完成进程之间的通信
- 6、使用多进程完成文件的拷贝
实现过程代码
1、创建子进程
import time
import multiprocessing
import os
def proc_func(number,age):
print(age)
print("这是子进程%d PID:%d 父进程的PID:%d" % (number,os.getpid(),os.getppid()))
for i in range(3):
print("这是子进程")
time.sleep(1)
if __name__ == '__main__':
# 创建一个子进程
# 创建一个进程的执行计划 target指定子进程执行的函数代码 args指定函数代码所需的参数
pro = multiprocessing.Process(target=proc_func, args=(100,), kwargs={'age':18})
# PID process identify
# os.getpid() 获取当前进程的PID
# os.getppid() parent process identify 获取当前进程的父进程的PID
# 启动子进程的创建和执行
pro.start()
# 用来判断子进程是否存活 存活返回True 退出了返回False
print(pro.is_alive())
# 用来阻塞等待子进程结束 然后才会继续往下执行 如果有参数 则表示阻塞等待的超时时间
pro.join(1)
print("join1 ")
print(pro.is_alive())
pro.join()
print(pro.is_alive())
# while True:
# print("这是主进程 PID:%d" % os.getpid())
# time.sleep(1)
# """如果创建子进程 怎么获取当前进程PID 当前进程的父进程的PID(PPID)"""
2、测试Process对象的相关方法
import time
import multiprocessing
import os
def proc_func(number,age):
print(age)
print("这是子进程%d PID:%d 父进程的PID:%d" % (number,os.getpid(),os.getppid()))
for i in range(3):
print("这是子进程")
time.sleep(1)
if __name__ == '__main__':
# 创建一个子进程
# 创建一个进程的执行计划 target指定子进程执行的函数代码 args指定函数代码所需的参数
pro = multiprocessing.Process(target=proc_func, args=(100,), name='SSS',kwargs={'age':18})
# PID process identify
# os.getpid() 获取当前进程的PID
# os.getppid() parent process identify 获取当前进程的父进程的PID
# 启动子进程的创建和执行
# 如果子进程还没有创建 则获取不到PID
# print(pro.pid)
pro.start()
# 获取进程对象标识的 进程的名称
print(pro.name)
# os.getpid()
print(pro.pid)
print(pro.is_alive())
# terminate()作用是告诉操作系统 让子进程退出 -----> 产生了时间差
# pro.terminate()
# time.sleep(0.1)
pro.join()
print(pro.is_alive())
3、多进程执行顺序是不确定的
import multiprocessing
import time
def worker1(no):
while True:
print(no)
time.sleep(1)
def worker2(no):
while True:
print(no)
time.sleep(1)
if __name__ == '__main__':
# 多个进程执行顺序不确定
for i in range(5):
pro1 = multiprocessing.Process(target=worker1,args=(i,))
pro1.start()
4、进程之间不共享全局数据
import multiprocessing
import time
g_number = 0
def worker1(no):
print(g_number)
global g_number
g_number += 99
while True:
time.sleep(1)
print("worker1 获取到的%d" % g_number)
def worker2(no):
while True:
time.sleep(1)
print("worker2 获取到的%d" % g_number)
if __name__ == '__main__':
# 多个进程内部不共享全局数据 ----> 每个进程是独立的数据空间
# 在主进程创建子进程的时候 会将全局数据给子进程拷贝一份
# 在子进程中修改全局数据不影响其他进程的全局数据
pro1 = multiprocessing.Process(target=worker1,args=(0,))
pro1.start()
pro2 = multiprocessing.Process(target=worker2,args=(1,))
pro2.start()
5、使用Queue完成进程之间的通信
import multiprocessing
import time
"""主进程往队列中放入屏幕上输入的数据 子进程从队列中取出数据并且打印出来"""
def proc_func(queue):
while True:
if queue.empty():
print("队列是空的 我稍后来取一次")
time.sleep(2)
else:
data = queue.get()
print("从队列中取出数据%s" % data)
time.sleep(2)
if __name__ == '__main__':
# 1 创建一个队列 参数表示队列的最大长度
queue = multiprocessing.Queue(3)
# 2 创建一个子进程
pro = multiprocessing.Process(target=proc_func, args=(queue,))
pro.start()
# 3 录入数据 放入队列
while True:
if queue.full():
print("队列已满")
time.sleep(1)
else:
data = input("请输入:")
queue.put(data)
print("当前队列数据条数是%s" % queue.qsize())
"""如何创建队列 放数据 取数据"""
6、使用多进程完成文件的拷贝
import os
import multiprocessing
import time
def copy_file(src_path, file_name, dest_path, queue):
"""源目录 文件名 目的目录"""
# demo 01.py demo-备份
# 打开一个源文件 读取
src_file = open(src_path + '/' + file_name, 'rb')
# 打开一个目标文件 写入
dest_file = open(dest_path + '/' + file_name, 'wb')
file_data = src_file.read()
dest_file.write(file_data)
# 关闭文件
src_file.close()
dest_file.close()
# 通过队列告诉主进程 我已经完成这个文件的拷贝
queue.put(file_name)
if __name__ == '__main__':
# 1 用户输入需要拷贝的源目录名称
src_path = input("请输入你需要拷贝的目录名:")
# 2 根据该目录名称 创建一个目的目录 -备份
dest_path = src_path + '-备份'
os.mkdir(dest_path)
# 创建一个队列 -主进程 和 多个完成文件拷贝的子进程之间 进行通信
queue = multiprocessing.Queue()
# 3 获取到源目录下使用的文件信息列表 为每个文件复制任务创建一个进程完成
file_list = os.listdir(src_path)
for file in file_list:
# print(file)
pro = multiprocessing.Process(target=copy_file, args=(src_path, file, dest_path, queue))
pro.start()
# 计数 完成拷贝的文件数量
count = 0
while True:
queue.get()
count += 1
print("\r 当前进度是%% %f" % (count / len(file_list) * 100), end='')
time.sleep(0.4)
if count == len(file_list):
print("完成拷贝")
break