メモリ リークが遅く、さまざまな理由で取り除くことができないアプリケーションがあります。そこで、ワーカーを定期的に死んで復活させるという古いトリックを使用したいと思います。
(つまり、マルチプロセッシング プールで maxtasksperchild と同じ戦略を使用します... "...他のシステム (Apache、mod_wsgi など) で見られる、ワーカーによって保持されているリソースを解放するための頻繁なパターンは、プール内のワーカーが完了できるようにすることです。終了し、クリーンアップされ、古いプロセスを置き換えるために新しいプロセスが生成される前に、一定量の作業のみ...」)
これまでのところ、私が思いついた最高の方法は、スリープしてから を呼び出すスレッドを持つことos._exit(-1)
です。
それが進むべき道ですか、それとも定期的にワーカーをリサイクルするより良い方法はありますか?
現時点で私が下っているパスは次のとおりです。
class Quitter(Thread):
def run(self):
while True:
time.sleep(random.randrange(5, 7)):
print str(os.getpid())
os._exit(-1)
Quitter().start()
ガンコーンは次のように応答します。
2013-03-13 03:21:24 [6487] [INFO] Booting worker with pid: 6487
...
2013-03-13 03:21:30 [6492] [INFO] Booting worker with pid: 6487