我正在开发的应用程序主要是API,但也有一个多线程后台作业处理系统,用于执行计划的作业以及临时API,它们需要很长时间才能获得即时的API响应。
这将通过金枪鱼分叉10次。任何单个分叉的流程都能够接管要运行的作业,因此,在处理流程与API请求的服务之间,是平衡的。
我面临的挑战是,每个进程将如何继续声明作业处理所需的最大内存量。有些作业需要1.5GB-2GB的内存。
如果有足够的时间,最终所有10个进程都必须处理此类工作,并且每个进程都将占用2GB以上的内存。即使该进程的平均内存使用很少超过100MB。
这些密集型作业仅通过流程中的专用线程运行。
是否有任何机制可以强迫Python在线程关闭时释放专门为线程声明的内存?还是任何强制Python进程仅将内存重置为当时需要的通用机制?
旁注:我也正在探索派生而不是线程,但是到目前为止,这还引入了其他不确定的问题。
解决方案
如果没有有关您的API和辅助进程/线程正在做什么的具体示例,则很难提供特定的答案。
Python是一种引用计数语言:当一个对象未被其他任何对象引用时,可以随意进行垃圾回收。可以强制垃圾收集器运行(请参阅https://docs.python.org/3/library/gc.html),但几乎总是最好让它自己做。
当工作线程退出时,线程内创建的任何对象都可能被垃圾回收;唯一的例外是放置在某些全局数据结构中的对象(但是用例听起来并不像您要做的那样)。