- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以使用 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).
如果没有人在目标目录中更改权限,您应该不太担心此操作失败的可能性。 “如果 src 和 dst 在不同的文件系统上”的场景似乎不可行,因为源路径(临时文件)只是通过向目标路径添加后缀来构建的,所以它们应该在同一个目录中。
其他关于重命名原子性的问题:
关于python - joblib.Memory 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66431722/
我正在努力解决 joblib 问题。 我需要将推理应用程序推送到远程服务器,并且我还需要加载保存的标准缩放器,因为如果我尝试适应,我会收到内存不足异常。我无法对服务器进行物理更改,因为它是 sap c
我在 Docker 容器内的 Flask 应用程序中运行 joblib 以及由 supervisord 启动的 uWSGI(启动时启用线程)。 网络服务器启动显示如下错误: unable to loa
我正在尝试在 python 中使用并行计算包 joblib。我可以执行下面的例子并得到结果 Parallel(n_jobs=8)(delayed(sqrt)(i) for i in range(10)
这是我的代码: from math import sqrt from joblib import Parallel, delayed import multiprocessing def parall
我正在使用Python中joblib包中的Parallel函数。我只想使用此函数来处理我的函数之一,但不幸的是整个代码是并行运行的(除了其他函数)。 示例: from joblib import Pa
我正在努力学习 joblib模块作为 python 中内置 multiprocessing 模块的替代品。我习惯于使用 multiprocessing.imap 在可迭代对象上运行一个函数并返回结果。
我正在尝试使用 joblib 来并行化一个在函数上运行的循环。我希望显示函数的中间 print 命令,而不仅仅是函数的 return 值。 from joblib import Parallel, d
我想打乱 3D numpy 数组中的值,但前提是它们 > 0。 当我用单核运行我的函数时,它甚至比使用 2 个核快得多。这远远超出了创建新 python 进程的开销。我错过了什么? 以下代码输出: r
我的目标结构: 工具 model_maker.py 模特 模型在这里 我当前的代码,位于工具目录中 joblib.dump(pipeline, "../models/model_full_June20
是否可以使用 joblib.Memory 以线程安全的方式写入跨多个进程的公共(public)缓存。在什么情况下,这会失败或导致错误? 最佳答案 库首先写入临时文件,然后将临时文件移动到目的地。 So
我目前正在尝试实现 parallel for循环使用 joblib在 python 中 3.8.3 . 在 for 循环中,我想将一个类方法应用于一个类的实例,同时在另一个类中应用一个方法。 这是一个
我的代码看起来像这样: from joblib import Parallel, delayed # prediction model - 10s of megabytes on disk LARGE
from joblib import Parallel, delayed def func(v): temp.append(v) return temp = [] Parallel(n
有关于使用内存映射文件在 Joblib 中持久保存 Numpy 数组的良好文档。 在最近的版本中,Joblib(显然)会以这种方式自动保留和共享 Numpy 数组。 Pandas 数据帧也会被持久化,
我正在运行一个需要一段时间才能评估 16 次的函数。然而,所有这些运行都是相互独立的。因此我决定使用 joblib 来加速它。 Joblib 的工作方式就像它应该的那样并加快了速度,但我正在努力解决一
我正在使用 joblib 并行化我的 python 3.5 代码。 如果我这样做: from modules import f from joblib import Parallel, delaye
我正在使用 Random Forest Regressor python 的 scikit-learn 模块来预测一些值。我使用 joblib.dump 来保存模型。有 24 个 joblib.dum
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我想问同样的问题 Python 3: does Pool keep the original order of data passed to map?对于作业库。例如: Parallel(n_jobs
我需要在使用 Joblib 并行的函数中生成随机数。但是,从内核生成的随机数是完全相同的。 目前我通过为不同的核心分配随机种子来解决这个问题。有什么简单的方法可以解决这个问题吗? 最佳答案 这是预料之
我是一名优秀的程序员,十分优秀!