深入理解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线程锁(thread)学习示例
Dec 04 Python
python实现提取百度搜索结果的方法
May 19 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python 除法保留两位小数点的方法
Jul 16 Python
python安装twisted的问题解析
Aug 21 Python
python pexpect ssh 远程登录服务器的方法
Feb 14 Python
python 爬取学信网登录页面的例子
Aug 13 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
如何理解Python中的变量
Jun 01 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 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 404错误页面实现代码
2009/06/22 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
浅谈php的优缺点
2015/07/14 PHP
php错误日志简单配置方法
2016/07/11 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
js计算精度问题小结
2013/04/22 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python多线程学习资料
2012/12/19 Python
python基础教程之Hello World!
2014/08/29 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
Django web框架使用url path name详解
2019/04/29 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
质检部岗位职责
2013/11/11 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
党员民主生活会材料
2014/12/15 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
张丽莉观后感
2015/06/16 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
CSS中实现动画效果-附案例
2022/02/28 HTML / CSS