1、需掌握python基础语法、python文件操作、python模块应用
2、开发工具:pycharm、python3.6
及以上版本
3、学习内容:进程、线程、多任务应用
多任务是指在同一时间内执行多个任务
进程是资源分配的最小单位,他是操作系统进行资源分配和调度运行的基本单位。通俗理解:一个正在运行的一个程序就是一个进程。例如:正在运行的qq、wechat等,它们都是一个进程。
导入进程包
import multiprocessing
通过进程类创建进程对象
进程对象 = multiprocessing.Process()
启动进程执行任务
进程对象.start()
单任务
import time
def sing():
for i in range(3):
print("唱歌。。。")
time.sleep(0.5)
def dance():
for i in range(3):
print("跳舞。。。")
time.sleep(0.5)
if __name__ == '__main__':
time1 = time.time()
sing()
dance()
print(time.time()-time1)
输出结果
唱歌。。。
唱歌。。。
唱歌。。。
跳舞。。。
跳舞。。。
跳舞。。。
3.0027265548706055
使用多进程实现多任务
import multiprocessing
import time
def sing():
for i in range(3):
print("唱歌。。。")
time.sleep(0.5)
def dance():
for i in range(3):
print("跳舞。。。")
time.sleep(0.5)
if __name__ == '__main__':
time1 = time.time()
s1 = multiprocessing.Process(target=sing)
d1 = multiprocessing.Process(target=dance)
s1.start()
d1.start()
s1.join() #这个方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步
d1.join()
print(time.time()-time1)
输出结果
唱歌。。。
跳舞。。。
唱歌。。。
跳舞。。。
唱歌。。。
跳舞。。。
1.7515902519226074
import multiprocessing
import time
def sing(name, num):
for i in range(num):
print("%s在唱歌。。。"%name)
time.sleep(0.5)
def dance(num):
for i in range(num):
print("跳舞。。。")
time.sleep(0.5)
if __name__ == '__main__':
# 以元组形式传参
s1 = multiprocessing.Process(target=sing, args=('小明', 3))
# 以字典形式传参
d1 = multiprocessing.Process(target=dance, kwargs={
"num": 5, })
s1.start()
d1.start()
当程序中进程的数量越来越多时,如果没有办法区分主进程和子进程还有不同的子进程,那么就无法进行有效的进程管理,为了方便管理实际上每个进程都是有自己的编号的。
获取当前进程编号
os.getpid()
获取当前父进程编号
os.getppid()
import multiprocessing
import time
import os
def sing(name, num):
print("唱歌进程的编号: ", os.getpid())
print("唱歌进程的父进程的编号: ", os.getppid())
for i in range(num):
print("%s在唱歌。。。"%name)
time.sleep(0.5)
def dance(num):
print("跳舞进程的编号: ", os.getpid())
print("跳舞进程的父进程的编号: ", os.getppid())
for i in range(num):
print("跳舞。。。")
time.sleep(0.5)
if __name__ == '__main__':
print("主进程的编号: ", os.getpid())
# 以元组形式传参 顺序和参数顺序一致
s1 = multiprocessing.Process(target=sing, args=('小明', 3))
# 以字典形式传参 key和参数名保持一致
d1 = multiprocessing.Process(target=dance, kwargs={
"num": 5, })
s1.start()
d1.start()
输出结果:
主进程的编号: 10620
唱歌进程的编号: 18412
唱歌进程的父进程的编号: 10620
小明在唱歌。。。
跳舞进程的编号: 9924
跳舞进程的父进程的编号: 10620
跳舞。。。
小明在唱歌。。。
跳舞。。。
小明在唱歌。。。
跳舞。。。
跳舞。。。
跳舞。。。
import time
import multiprocessing
def work():
for i in range(10):
print("工作中。。。。")
time.sleep(0.2)
if __name__ == '__main__':
work_process = multiprocessing.Process(target=work)
work_process.start()
time.sleep(1)
print("主进程执行结束")
输出结果:
工作中。。。。
工作中。。。。
工作中。。。。
工作中。。。。
主进程执行结束
工作中。。。。
工作中。。。。
工作中。。。。
工作中。。。。
工作中。。。。
工作中。。。。
主进程结束后不会再继续执行子进程中剩余的工作
import time
import multiprocessing
def work():
for i in range(10):
print("工作中。。。。")
time.sleep(0.2)
if __name__ == '__main__':
# 设置守护主进程,主进程执行完成,则结束
# 方式1
work_process = multiprocessing.Process(target=work, daemon=True)
# 方式2
# work_process.daemon = True
work_process.start()
time.sleep(1)
print("主进程执行结束")
输出结果:
工作中。。。。
工作中。。。。
工作中。。。。
工作中。。。。
主进程执行结束
os.listdir
获取源目录中的文件列表import os
import multiprocessing
def copy_file(file_name, source_dir, dest_dir):
# 1 拼接源文件路径和目标文件路径
source_path = source_dir + '\\' + file_name
dest_path = dest_dir + '\\' + file_name
# 2 打开源文件和目标文件
with open(source_path, 'rb') as source_file:
with open(dest_path, 'wb') as dest_file:
# 3 循环读取源文件到目标路径
while True:
data = source_file.read(1024)
if data:
dest_file.write(data)
else:
break
if __name__ == '__main__':
# 1 定义源文件夹和目标文件夹
source_dir = r'F:\迅雷下载\视频-智能机器人从0到1系统入门课程\视频'
dest_dir= r'F:\目标文件夹'
# 2.创建目标文件夹
try:
os.mkdir(dest_dir)
except:
print("目标文件夹已经存在")
# 3.读取源文件夹的文件列表
file_list = os.listdir(source_dir)
# 4.遍历文件列表实现拷贝
for file_name in file_list:
# copy_file(file_name, source_dir, dest_dir)
# 5.使用多进程实现多任务拷贝
sub_process = multiprocessing.Process(target=copy_file, args=(file_name, source_dir, dest_dir))
sub_process.start()
导入线程包
import threading
通过线程类创建进程对象
线程对象 = threading.Thread()
启动线程执行任务
线程对象.start()
import os
import threading
def copy_file(file_name, source_dir, dest_dir):
# 1 拼接源文件路径和目标文件路径
source_path = source_dir + '\\' + file_name
dest_path = dest_dir + '\\' + file_name
# 2 打开源文件和目标文件
with open(source_path, 'rb') as source_file:
with open(dest_path, 'wb') as dest_file:
# 3 循环读取源文件到目标路径
while True:
data = source_file.read(1024)
if data:
dest_file.write(data)
else:
break
if __name__ == '__main__':
# 1 定义源文件夹和目标文件夹
source_dir = r'F:\迅雷下载\视频-智能机器人从0到1系统入门课程\视频'
dest_dir= r'F:\目标文件夹'
# 2.创建目标文件夹
try:
os.mkdir(dest_dir)
except:
print("目标文件夹已经存在")
# 3.读取源文件夹的文件列表
file_list = os.listdir(source_dir)
# 4.遍历文件列表实现拷贝
for file_name in file_list:
# copy_file(file_name, source_dir, dest_dir)
# 5.使用多线程实现多任务拷贝
sub_thread = threading.Thread(target=copy_file, args=(file_name, source_dir, dest_dir))
sub_thread.start()
无序,由CPU调度决定某个线程先执行