在我们日常写程序的过程中,免不了与文件系统打交道,各种开发语言都提供了与文件系统交互的指令函数,比如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:所要创建的目录
【Python中并发请求创建文件夹带来的线程安全问题】参数mode传递给mkdir();
如果exist_ok是False(默认),当目标目录(即要创建的目录)已经存在,会抛出一个OSError 。
文章插图
具体使用实例如下:
文章插图
在上图/data/zzz文件夹下没有任何文件夹,我们现在就来创建一个名为a的文件夹:
文章插图
这时a文件夹已经存在,我们再执行一下上次的指令函数:
文章插图
这时就会报错,如果程序中没有处理异常,或者异常之后没有做补偿措施,那么会对业务系统中的某个方面会有一些影响,虽然影响不是很大,但是我们完全可以通过编程语言提供的其他函数,进行系统完善,下面就用os.makdirs(),来避免上面的错误:
文章插图
从上图中可以看出,如果os.makedirs()使用参数exist_ok的默认值,也就是exist_ok=False,还是会报[Errno 17] File exists的错误,这时就要用exist_ok=True,这样如果文件夹存在,会忽略创建文件夹 。也有人会用os.mkdir()这样写程序,就是加一个判断,如果文件夹存在,才去用os.mkdir()去创建文件夹,如果这个方法没有加锁,那么就会带来线程安全问题,就是两个或者多个线程同时进入创建文件夹的只指令处,也会发生抛出异常的现象,如果加锁了,也会对该方法性能方面有些影响,况且锁使用不好,容易把自己都给锁死,所以还是使用编程语言提供的函数去正确的编程 。这两个还有一个区别就是是否支持递归创建文件夹:
文章插图
可见os.mkdir()不支持递归创建文件夹,只有父层文件夹存在时,才能创建子层文件夹,而os.makedirs()是支持递归创建文件夹的 。
推荐阅读
- 高向荣,安溪铁观音要引领中国茶产业发展
- 浅说南京人婚礼中的三道茶
- 历史揭秘:慈禧口中的夜明珠到底是啥? 慈禧夜明珠来自哪里
- 宁波茶市,普洱茶涨价 以中高端茶为主
- 湖州市名优茶中绿杯上夺得两金两银
- 贵港市农业局领导行检查富伟茶叶生产基地
- 渔政属于什么编制 中国渔政
- 初中班主任德育工作计划8篇 班主任德育工作计划
- 国足进世界杯的概率 中国队进2022世界杯的几率大吗
- 威士忌卖遍全世界,中国白酒却难以风靡全球,这到底是为什么?