您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python中并发请求创建文件夹带来的线程安全问题

时间:2019-12-23 14:56:33  来源:  作者:

在我们日常写程序的过程中,免不了与文件系统打交道,各种开发语言都提供了与文件系统交互的指令函数,比如Python中的os模块,就提供了许多这样的指令函数,今天就以创建文件夹为例,来说一下,如果用的不当,会带来的线程安全问题。

在Python的os模块中,创建文件夹有两种方式,一个是os.mkdir(),另外一个是os.makedirs(),这两个的区别如下:

os.mkdir() 函数:os.mkdir(path, mode=0o777)

使用模式mode创建名为path的目录。如果目录已经存在,则抛出异常FileExistsError。

在一些系统中,可以忽略mode,在一些平台可以通过调用chmod()来指定它们。mode就是所创建目录对应的文件及文件夹的读写权限,可以参考linux命令下的chmod命令来理解。

os.makedirs()函数:os.makedirs(path, mode=0o777, exist_ok=False)

递归目录创建函数,和mkdir()很像,但是所有中间级目录都要包含叶目录。

递归创建目录,题中应有之意即路径中哪一层不存在,则自动创建。

区别于os.mkdir(path, mode=0o777),只创建最后一层的目录。

path:所要创建的目录

参数mode传递给mkdir();

如果exist_ok是False(默认),当目标目录(即要创建的目录)已经存在,会抛出一个OSError。

 

Python中并发请求创建文件夹带来的线程安全问题

 

具体使用实例如下:

 

Python中并发请求创建文件夹带来的线程安全问题

 

在上图/data/zzz文件夹下没有任何文件夹,我们现在就来创建一个名为a的文件夹:

 

Python中并发请求创建文件夹带来的线程安全问题

 

这时a文件夹已经存在,我们再执行一下上次的指令函数:

 

Python中并发请求创建文件夹带来的线程安全问题

 

这时就会报错,如果程序中没有处理异常,或者异常之后没有做补偿措施,那么会对业务系统中的某个方面会有一些影响,虽然影响不是很大,但是我们完全可以通过编程语言提供的其他函数,进行系统完善,下面就用os.makdirs(),来避免上面的错误:

 

Python中并发请求创建文件夹带来的线程安全问题

 

从上图中可以看出,如果os.makedirs()使用参数exist_ok的默认值,也就是exist_ok=False,还是会报[Errno 17] File exists的错误,这时就要用exist_ok=True,这样如果文件夹存在,会忽略创建文件夹。也有人会用os.mkdir()这样写程序,就是加一个判断,如果文件夹存在,才去用os.mkdir()去创建文件夹,如果这个方法没有加锁,那么就会带来线程安全问题,就是两个或者多个线程同时进入创建文件夹的只指令处,也会发生抛出异常的现象,如果加锁了,也会对该方法性能方面有些影响,况且锁使用不好,容易把自己都给锁死,所以还是使用编程语言提供的函数去正确的编程。这两个还有一个区别就是是否支持递归创建文件夹:

 

Python中并发请求创建文件夹带来的线程安全问题

 

可见os.mkdir()不支持递归创建文件夹,只有父层文件夹存在时,才能创建子层文件夹,而os.makedirs()是支持递归创建文件夹的。



Tags:Python 安全   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在我们日常写程序的过程中,免不了与文件系统打交道,各种开发语言都提供了与文件系统交互的指令函数,比如Python中的os模块,就提供了许多这样的指令函数,今天就以创建文件夹为例,来...【详细内容】
2019-12-23  Tags: Python 安全  点击:(101)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  菜鸟学python    Tags:Python4   点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  风度翩翩的Python    Tags:Python   点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(4)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(8)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(8)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条