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



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

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

法典:

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

编辑:我已经为WORKER_THREADS尝试了不同的值,无论如何它都会消耗内存。我目前在测试时使用 5 到 10 之间。降低最大工作线程数确实会减慢问题的速度,但最终会失败并出现相同的内存错误。

当前代码(工作,但占用内存(:

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)

我需要它等到所有期货都完成,因为它在 Windows 服务中运行,并在完成后再次"循环"。有没有办法在不消耗记忆的情况下使用这样的futures?是否有另一种"多线程"方法可以在没有内存问题的情况下执行相同的工作?

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

相关内容

  • 没有找到相关文章

最新更新