Skip to content
This repository was archived by the owner on Oct 10, 2025. It is now read-only.

Commit d9511f6

Browse files
authored
fix: settings run id (#32)
1 parent 71b4c80 commit d9511f6

File tree

3 files changed

+88
-3
lines changed

3 files changed

+88
-3
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ build-backend = "hatchling.build"
99

1010
[project]
1111
name = "swankit"
12-
version = "0.2.2"
12+
version = "0.2.3"
1313
dynamic = ["readme", "dependencies"]
1414
description = "Base toolkit for SwanLab"
1515
license = "Apache-2.0"

swankit/core/settings.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
swankit 为 swanlab 定制的配置类
99
"""
1010
import os
11+
import time
12+
from datetime import datetime
1113
from typing import Tuple, List, Optional
1214

1315

@@ -93,12 +95,27 @@ def __init__(self, logdir: str, run_id: str, version: str, should_save: bool) ->
9395
LazySettings.__init__(self)
9496
# ---------------------------------- 静态信息 ----------------------------------
9597
self.__should_save = should_save
96-
self.__run_id = run_id
9798
self.__version = version
99+
self.__run_id = run_id
100+
# ----------------------- 检测运行文件夹的创建,确保文件夹在当前进程唯一占有 ----------
101+
run_dir = None
102+
while True:
103+
run_dir is not None and time.sleep(1)
104+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
105+
run_name = "run-{}-{}".format(timestamp, run_id)
106+
run_dir = os.path.join(logdir, run_name)
107+
if not should_save:
108+
break
109+
try:
110+
os.mkdir(run_dir)
111+
break
112+
except FileExistsError:
113+
pass
114+
assert run_dir is not None, "run_dir should not be None, please check the logdir and run_id"
98115
# ---------------------------------- 文件夹信息 ----------------------------------
99116
self.__root_dir = os.path.dirname(logdir)
100117
self.__swanlog_dir = logdir
101-
self.__run_dir = os.path.join(logdir, run_id)
118+
self.__run_dir = run_dir
102119
self.__console_dir = os.path.join(self.run_dir, "console")
103120
self.__log_dir = os.path.join(self.run_dir, "logs")
104121
self.__files_dir = os.path.join(self.run_dir, "files")

test/unit/core/test_settings.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
@description: 测试 settings
66
"""
77

8+
import os.path
9+
import time
10+
from datetime import datetime
11+
812
import pytest
913

1014

@@ -26,3 +30,67 @@ def test_lazy_settings():
2630
settings.exp_colors = ("green", "yellow")
2731
with pytest.raises(ValueError, match="description can only be set once"):
2832
settings.description = "test description 2"
33+
34+
35+
def test_settings():
36+
"""
37+
主要测试 settings 初始化时遇见相同文件夹自动创建新文件夹的功能
38+
"""
39+
from swankit.core.settings import SwanLabSharedSettings
40+
from tutils import TEMP_DIR
41+
42+
# 测试创建文件夹
43+
# 尽量保持代码运行在一秒的开始
44+
time.sleep(1 - (time.time() % 1)) # 确保时间戳在整秒
45+
start = time.time()
46+
run_id = "111111"
47+
run_dir = os.path.join(TEMP_DIR, "run-{}-{}".format(datetime.now().strftime("%Y%m%d_%H%M%S"), run_id))
48+
settings = SwanLabSharedSettings(logdir=TEMP_DIR, run_id=run_id, version="develop", should_save=True)
49+
assert time.time() - start < 1 # 此时不应该等待一秒
50+
assert settings.run_dir == run_dir
51+
assert settings.run_id == run_id
52+
53+
# 测试创建同名文件夹
54+
# 尽量保持代码运行在一秒的开始
55+
time.sleep(1 - (time.time() % 1)) # 确保时间戳在整秒
56+
start = time.time()
57+
# 测试创建一个存在的文件夹
58+
run_id = "123456"
59+
run_dir = os.path.join(TEMP_DIR, "run-{}-{}".format(datetime.now().strftime("%Y%m%d_%H%M%S"), run_id))
60+
os.mkdir(run_dir)
61+
settings = SwanLabSharedSettings(logdir=TEMP_DIR, run_id=run_id, version="develop", should_save=True)
62+
assert 2 > time.time() - start >= 1 # 确保至少等待了一秒
63+
assert settings.run_dir != run_dir # 确保没有使用原来的文件夹
64+
assert settings.run_id == run_id # 确保run_id正确
65+
66+
67+
def test_settings_no_save():
68+
"""
69+
测试不保存的情况,此时不会检查文件夹唯一性
70+
"""
71+
from swankit.core.settings import SwanLabSharedSettings
72+
from tutils import TEMP_DIR
73+
74+
# 测试创建文件夹
75+
# 尽量保持代码运行在一秒的开始
76+
time.sleep(1 - (time.time() % 1)) # 确保时间戳在整秒
77+
start = time.time()
78+
run_id = "111111"
79+
run_dir = os.path.join(TEMP_DIR, "run-{}-{}".format(datetime.now().strftime("%Y%m%d_%H%M%S"), run_id))
80+
settings = SwanLabSharedSettings(logdir=TEMP_DIR, run_id=run_id, version="develop", should_save=False)
81+
assert time.time() - start < 1 # 此时不应该等待一秒
82+
assert settings.run_dir == run_dir
83+
assert settings.run_id == run_id
84+
85+
# 测试创建同名文件夹
86+
# 尽量保持代码运行在一秒的开始
87+
time.sleep(1 - (time.time() % 1)) # 确保时间戳在整秒
88+
start = time.time()
89+
# 测试创建一个存在的文件夹
90+
run_id = "123456"
91+
run_dir = os.path.join(TEMP_DIR, "run-{}-{}".format(datetime.now().strftime("%Y%m%d_%H%M%S"), run_id))
92+
os.mkdir(run_dir)
93+
settings = SwanLabSharedSettings(logdir=TEMP_DIR, run_id=run_id, version="develop", should_save=False)
94+
assert time.time() - start < 1 # 此时不应该等待一秒
95+
assert settings.run_dir == run_dir
96+
assert settings.run_id == run_id

0 commit comments

Comments
 (0)