深入理解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之不要红头文件(2)
Sep 28 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
Python中字符串的修改及传参详解
Nov 30 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
python list元素为tuple时的排序方法
Apr 18 Python
python 实现UTC时间加减的方法
Dec 31 Python
python tkinter控件布局项目实例
Nov 04 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 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 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
微信支付开发发货通知实例
2016/07/12 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python实现单向链表详解
2018/02/08 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
Python networkx包的实现
2020/02/14 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
打架检讨书300字
2014/02/02 职场文书
发展部经理职责规定
2014/02/22 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
大学生自我评价范文
2015/03/03 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
九年级英语教学反思
2016/02/15 职场文书