gpt4 book ai didi

python - joblib.Memory 是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-05 03:44:26 26 4
gpt4 key购买 nike

是否可以使用 joblib.Memory 以线程安全的方式写入跨多个进程的公共(public)缓存。在什么情况下,这会失败或导致错误?

最佳答案

库首先写入临时文件,然后将临时文件移动到目的地。 Source code :

def _concurrency_safe_write(self, to_write, filename, write_func):
"""Writes an object into a file in a concurrency-safe way."""
temporary_filename = concurrency_safe_write(to_write,
filename, write_func)
self._move_item(temporary_filename, filename)

写入临时文件在同一操作系统中的进程之间似乎是安全的,因为它在文件名中包含 pid。此外,它在同一进程中的线程之间似乎是安全的,因为它包含线程 ID。 Source :

def concurrency_safe_write(object_to_write, filename, write_func):
"""Writes an object into a unique file in a concurrency-safe way."""
thread_id = id(threading.current_thread())
temporary_filename = '{}.thread-{}-pid-{}'.format(
filename, thread_id, os.getpid())
write_func(object_to_write, temporary_filename)

return temporary_filename

将临时文件移动到目标位置在 Windows 上显示出问题。 Source :

if os.name == 'nt':
# https://github.com/joblib/joblib/issues/540
access_denied_errors = (5, 13)
from os import replace

def concurrency_safe_rename(src, dst):
"""Renames ``src`` into ``dst`` overwriting ``dst`` if it exists.
On Windows os.replace can yield permission errors if executed by two
different processes.
"""
max_sleep_time = 1
total_sleep_time = 0
sleep_time = 0.001
while total_sleep_time < max_sleep_time:
try:
replace(src, dst)
break
except Exception as exc:
if getattr(exc, 'winerror', None) in access_denied_errors:
time.sleep(sleep_time)
total_sleep_time += sleep_time
sleep_time *= 2
else:
raise
else:
raise
else:
from os import replace as concurrency_safe_rename # noqa

从该源代码中您可以看到,在 Windows 上,由于在 1 秒的总时间内出现访问被拒绝错误而未能将临时文件移动到目标位置,并且已使用指数退避重试,因此它可能会失败。

相同的源代码有指向问题 #540 的链接描述 Windows 错误并以评论结束:

Fixed by #541 (hopefully).

评论中的“(希望)”似乎表明作者无法保证修复是最终的,但该问题尚未重新打开,因此可能不会再次发生。

对于其他操作系统,没有特殊逻辑或重试,只有标准 os.replace()用来。描述中提到了它“可能会失败”以及“将是一个原子操作”的情况:

Rename the file or directory src to dst. If dst is a directory, OSError will be raised. If dst exists and is a file, it will be replaced silently if the user has permission. The operation may fail if src and dst are on different filesystems. If successful, the renaming will be an atomic operation (this is a POSIX requirement).

如果没有人在目标目录中更改权限,您应该不太担心此操作失败的可能性。 “如果 srcdst 在不同的文件系统上”的场景似乎不可行,因为源路径(临时文件)只是通过向目标路径添加后缀来构建的,所以它们应该在同一个目录中。

其他关于重命名原子性的问题:

关于python - joblib.Memory 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66431722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com