深入理解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计算auc指标实例
Jul 13 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
使用tensorflow实现线性svm
Sep 07 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
python环境下安装opencv库的方法
Mar 05 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
python把一个字符串切开的实例方法
Sep 27 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 Python
python实现的人脸识别打卡系统
May 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与paypal整合方法
2010/11/28 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
Yii清理缓存的方法
2016/01/06 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
bootstrap table实例详解
2017/01/06 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
python中使用mysql数据库详细介绍
2015/03/27 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
Python模块WSGI使用详解
2018/02/02 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
深入学习python多线程与GIL
2019/08/26 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
幼儿园庆六一游园活动方案
2014/01/29 职场文书
安全生产标语
2014/06/06 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书