深入理解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实现的弹球小游戏示例
Aug 01 Python
Tensorflow卷积神经网络实例
May 24 Python
python中ASCII码和字符的转换方法
Jul 09 Python
python 解压pkl文件的方法
Oct 25 Python
Python正则表达式和元字符详解
Nov 29 Python
python文件转为exe文件的方法及用法详解
Jul 08 Python
django框架使用方法详解
Jul 18 Python
python实现windows倒计时锁屏功能
Jul 30 Python
pycharm配置git(图文教程)
Aug 16 Python
Python操作注册表详细步骤介绍
Feb 05 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
Python Opencv实现单目标检测的示例代码
Sep 08 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
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
Python格式化输出%s和%d
2018/05/07 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
keras中的History对象用法
2020/06/19 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
科研先进个人典型材料
2014/01/31 职场文书
创新比赛获奖感言
2014/02/13 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
读群众路线的心得体会
2014/09/03 职场文书
幼师大班个人总结
2015/02/13 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
上下班时间调整通知
2015/04/23 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
js实现自动锁屏功能
2021/06/02 Javascript
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android