python多线程
python多线程
多线程
threading,利用CPU和IO可以同时执行的原理
多进程
multiprocessing,利用多核CPU的能力,真正的并行执行任务
异步IO
asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行
- 使用Lock对资源加锁,防止冲突访问
- 使用Queue实现不同线程/进程之间的数据通信,实现生产者-消费者模式
- 使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果
- 使用sbuprocess启动外部程序的进程,并进行输入输出交互
python并发编程三种形式
- 多线程Thread
- 多进程Process
- 多协程Coroutine
多进程完成多任务
- 进程的创建步骤
导入进程包
import multiprocessing
通过进程类创建进程对象
#args指定任务传参,或者使用kwargs={"num":2}
进程对象=multiprocessing.Process(target=任务名,args=(3,))
启动进程执行任务
进程对象.start()
获取当前进程的编号
os.getpid()
#获取父进程编号
os.getppid()
主进程会等待所有子进程执行结束后再结束
设置守护主进程
#设置守护主进程,主进程退出后子进程直接销毁,不再执行子进程中的代码
work_process.daemon = True
多线程完成多任务
- 线程的创建步骤
import threading
线程对象=threading.Thread(target=任务名)
线程对象.start()
主线程和子线程的结束顺序
- 一般情况下,主线程要等到子线程都结束,自己再结束
- 想要主线程不等待子线程执行完成,可以设置守护主线程
#设置守护主线程方式1,daemon=True守护主线程
work_thread = threading.Thread(target=work,daemon=True)
#设置守护主线程方式2
work_thread.setDaemon(True)
work_thread.start()
获取当前线程的信息
#通过current_thread方法获取线程对象
current_thread = threading.current_thread()
#通过current_thread对象可以知道线程的相关信息,例如被创建的顺序
print(current_thread)
- 线程之间执行顺序是无序的,是由CPU调度决定某个线程先执行
案例演示
import os
import threading
# 拷贝函数
def copy_file(file_name,source_dir,dest_dir):
# 拼接源路径和目标路径
source_path = source_dir + "/" + file_name
dest_path = dest_dir + "/" + file_name
# 打开文件开始读写
with open(source_path,"rb") as source_file:
with open(dest_path,"wb") as dest_file:
while True:
data = source_file.read(1024)
# 如果有数据则写
if data:
dest_file.write(data)
else:
break
if __name__ == '__main__':
# 源文件夹
source_dir = ''
# 目标文件夹
dest_dir = ''
try:
# 创建文件夹
os.mkdir(dest_dir)
except:
print("目标文件夹已经存在了!")
# 获取源目录中所有文件列表
file_list = os.listdir(source_dir)
# 遍历列表中所有文件
for file_name in file_list:
# 调用函数执行拷贝
copy_file(file_name,source_dir,dest_dir)
# 创建多线程
sub_thread = threading.Thread(target=copy_file,args=(file_name,source_dir,dest_dir))
sub_thread.start()
作者:Jace Jin
github地址:https://github.com/buxianghua
原创文章版权归作者所有.
欢迎转载,转载时请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
欢迎转载,转载时请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.