gpt4 book ai didi

web-scraping - 内存泄漏在哪里?如何在python的多处理期间超时线程?

转载 作者:行者123 更新时间:2023-12-04 02:14:29 26 4
gpt4 key购买 nike

目前还不清楚如何正确地超时 joblib 的工作人员 Parallel在 python 中。其他人也有类似问题here , here , herehere .

在我的示例中,我使用了 50 joblib 的池 worker 与 threading后端。

并行调用(线程):

output = Parallel(n_jobs=50, backend  = 'threading')
(delayed(get_output)(INPUT)
for INPUT in list)

在这里, Parallel len(list) <= n_jobs 立即挂起而没有错误但仅限于 n_jobs => -1 .

为了规避这个问题,人们给出了 instructions关于如何为 Parallel 创建超时装饰器函数( get_output(INPUT) 在上面的例子中)使用 multiprocessing :

主要功能(修饰):
@with_timeout(10)    # multiprocessing
def get_output(INPUT): # threading
output = do_stuff(INPUT)
return output

多处理装饰器:
def with_timeout(timeout):
def decorator(decorated):
@functools.wraps(decorated)
def inner(*args, **kwargs):
pool = multiprocessing.pool.ThreadPool(1)
async_result = pool.apply_async(decorated, args, kwargs)
try:
return async_result.get(timeout)
except multiprocessing.TimeoutError:
return
return inner
return decorator

将装饰器添加到其他工作代码中会导致内存泄漏,超时长度的 2 倍加上 eclipse 崩溃。

装饰器中的泄漏在哪里?

如何在python的多处理期间超时线程?

最佳答案

在没有 hack 的情况下,不可能在 Python 中杀死线程.

您遇到的内存泄漏是由于您认为它们已被杀死的线程的积累。为了证明这一点,只需尝试检查您的应用程序正在运行的线程数量,您就会看到它们在缓慢增长。

在引擎盖下,ThreadPool 的线程不会终止,但会一直运行您的函数直到结束。

线程不能被杀死的原因是线程与父进程共享内存。因此,在确保应用程序内存完整性的同时杀死线程是非常困难的。

Java 开发人员想通了 long ago .

如果您可以在单独的进程中运行您的函数,那么您可以轻松地依赖超时逻辑,一旦达到超时,进程本身就会被终止。

Pebble 图书馆已经提供 decorators with timeout .

关于web-scraping - 内存泄漏在哪里?如何在python的多处理期间超时线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48540668/

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