linux递归创建文件夹_Python中并发请求创建文件夹带来的线程安全问题
在我們日常寫程序的過程中,免不了與文件系統打交道,各種開發語言都提供了與文件系統交互的指令函數,比如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。
具體使用實例如下:
在上圖/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()是支持遞歸創建文件夾的。
總結
以上是生活随笔為你收集整理的linux递归创建文件夹_Python中并发请求创建文件夹带来的线程安全问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mariab修改mysql端口_修改my
- 下一篇: centos5.8安装mysql_Cen