深入理解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中定义结构体的方法
Mar 04 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
python:动态路由的Flask程序代码
Nov 22 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
PyQT5 emit 和 connect的用法详解
Dec 13 Python
Python socket聊天脚本代码实例
Jan 02 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
TensorFlow 显存使用机制详解
Feb 03 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
全网最全python库selenium自动化使用详细教程
Jan 12 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
python列表操作实例
2015/01/14 Python
python多进程共享变量
2016/04/06 Python
儿童python练习实例
2018/05/27 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
物流管理毕业生自荐信范文
2014/03/15 职场文书
一分钟演讲稿
2014/04/30 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
财务管理制度范本
2015/08/04 职场文书
美容院管理规章制度
2015/08/05 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
详解MySQL中的主键与事务
2021/05/27 MySQL
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
Python读取和写入Excel数据
2022/04/20 Python
JAVA springCloud项目搭建流程
2022/05/11 Java/Android