深入理解python多线程编程


Posted in Python onApril 18, 2021

进程

进程的概念:
进程是资源分配的最小单位,他是操作系统进行资源分配和调度运行的基本单位。通俗理解:一个正在运行的一个程序就是一个进程。例如:正在运行的qq、wechat等,它们都是一个进程。
进程的创建步骤
1.导入进程包
 import multiprocessing
2.通过进程类创建进程对象
 进程对象 = multiprocessing.Process()
3.启动进程执行任务
 进程对象.start()

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)

带有参数的进程

args元组,kwargs字典

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

进程的注意点

主进程会等待所有的子进程执行结束在结束

设置守护主进程

主进程结束后不会再继续执行子进程中剩余的工作
work_process = multiprocessing.Process(target=work, daemon=True)

线程

线程的介绍

实现多任务的另一种形式
线程是程序执行的最小单位
同属一个进程的多个线程共享进程所拥有的全部资源

线程的创建步骤
导入线程包
 import threading
通过线程类创建进程对象
 线程对象 = threading.Thread()
启动线程执行任务
 线程对象.start()

优缺点对比

1.进程优缺点:
 优点:可以用多核,可以并行
 缺点:资源开销大
2.线程优缺点:
 优点:资源开销小
 缺点:不可用多核,依附于进程一个进程一个核

案例-多进程实现视频文件夹多任务拷贝器

需求分析:
目标文件夹是否存在,如果不存在就创建,存在则不创建
遍历源文件夹中所有文件,并拷贝到目标文件夹
采用进程实现多任务,并完成拷贝
实现步骤
定义源文件夹所在的路径,目标文件夹所在路径
创建目标文件夹
通过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'E:\TCT\TIFF_tran\pos_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 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()
   for file_name in file_list:
       sub_thread.join()
        sub_thread.join()#主线程等待所有线程结束才会结束

到此这篇关于python多线程编程的文章就介绍到这了,更多相关python多线程编程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
Python Web框架Flask中使用百度云存储BCS实例
Feb 08 Python
对于Python异常处理慎用“except:pass”建议
Apr 02 Python
Python中DJANGO简单测试实例
May 11 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
对于Python中RawString的理解介绍
Jul 07 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
python模拟实现斗地主发牌
Jan 07 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 #Python
python批量更改目录名/文件名的方法
Apr 18 #Python
python解决12306登录验证码的实现
django注册用邮箱发送验证码的实现
Apr 18 #Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 #Python
python3 实现mysql数据库连接池的示例代码
Python如何利用正则表达式爬取网页信息及图片
Apr 17 #Python
You might like
ASP和PHP都是可以删除自身的
2007/04/09 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
Python深入学习之装饰器
2014/08/31 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
python归并排序算法过程实例讲解
2020/11/04 Python
Python中过滤字符串列表的方法
2020/12/22 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
sort命令的作用和用法
2013/08/25 面试题
行政专员岗位职责
2014/01/02 职场文书
高一生物教学反思
2014/01/17 职场文书
护士岗位职责
2014/02/16 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
基于flask实现五子棋小游戏
2021/05/25 Python
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
零基础学java之循环语句的使用
2022/04/10 Java/Android
CSS的calc函数用法小结
2022/06/25 HTML / CSS