如何避免使用 concurrent.futures() 时的最大内存分配?

How to avoid maximum memory allocation with concurrent.futures() usage?

在下面提供一些我正在使用的代码片段,它运行良好,但在大约 5 分钟的过程中,最终开始抛出 malloc() 类型错误,因为我的笔记本电脑内存使用过多。

如您所见,我什至尝试使用强制 gc.collect() 语句并显式 del 立即设置变量,但无济于事。

代码:

user_guidsuser_groups_list 对象都是基本列表,每个元素中都有字符串数据。 update_user_groups{} 函数调用 API 并将结果记录到数据库,然后 returns.

编辑: 我已经为 WORKER_THREADS 尝试了不同的值,但无论如何它都会占用内存。我目前在测试时使用 5 到 10 个。降低 max workers 确实会减缓这个问题,但最终会因同样的内存错误而失败。

当前代码(有效,但占用内存):

with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER_THREADS) as executor:
    for user in user_guids:
        future = executor.submit(update_user_groups, user['Guid'], user_groups_list)
        future.add_done_callback(print_future_result)
        del future
        gc.collect()

我也这样试过(也吃内存):

with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER_THREADS) as executor:
    futures = [executor.submit(update_user_groups, user['Guid']) for user in user_guids]
    concurrent.futures.wait(futures, return_when=concurrent.futures.ALL_COMPLETED)

我需要它等到所有 futures 都完成,因为它在 Windows 服务中运行,一旦完成就再次 "loops" 。有没有办法像这样使用futures而不吃内存?是否有替代 "multithreaded" 方法可以在没有内存问题的情况下执行相同的工作?

关于这个的评论不多,所以我会用一个不太好的“答案”来回答我自己的问题……但它确实有效。对代码进行任何更改,我只是更新到 Python 的 64 位版本,它开始正常工作。甚至没有用完与以前相同的内存量。我得到的 2.5GB 的“上限”对我来说是一个危险信号,它尖叫着 32 位问题,所以我切换到 64 位,重建我的虚拟环境,并重新 运行 代码。现在运行良好,内存管理似乎更好!