UNIX系统中多进程创建相同中间目录是否会引发竞态条件?
问题描述
在UNIX系统中,两个并发进程同时调用如下Python代码中的create_dir函数,初始当前工作目录为空且不存在名为l1的子目录。请问是否会出现竞态条件,导致文件系统损坏或产生意外结果?
补充背景:运行远程Celery Worker,包含多个并行进程,负责将内容存入三级目录结构。例如content1存入l1_dir_name1/l2_dir_name1/content1_dir,content2存入l1_dir_name2/l2_dir_name2/content2_dir,可能出现共享同一级或两级父目录的情况。
相关代码
目录创建函数
from pathlib import Path def create_dir(last_component: str): path = Path("l1/l2") / last_component path.mkdir(parents=True, exist_ok=True)
进程调用
- 进程1调用:
create_dir('sub1')
- 进程2调用:
create_dir('sub2')
回答
不会出现竞态条件导致文件系统损坏或意外结果。
原因如下:
- UNIX系统中,底层的
mkdir系统调用是原子操作。Python的path.mkdir()正是基于这个系统调用实现的,即使使用parents=True递归创建父目录,每个目录的创建步骤都是原子性的。 - 当两个进程同时尝试创建
l1和l1/l2时,第一个进程创建成功后,第二个进程再调用mkdir创建已存在的目录,会因为exist_ok=True直接返回成功,不会抛出异常或引发冲突。 - 最终两个进程都会成功创建各自的目标目录
l1/l2/sub1和l1/l2/sub2,不会出现文件系统损坏、目录缺失等异常情况。
针对你提到的Celery Worker场景:即便多个进程需要创建共享父目录的三级目录,只要保持exist_ok=True的递归创建方式,就不会出现竞态问题,所有进程都能正常完成目标目录的创建。
内容的提问来源于stack exchange,提问作者Isaac To
相关产品推荐
相关产品推荐

