打赏

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()

posted @ 2023-08-29 20:21  不像话  阅读(18)  评论(0编辑  收藏  举报