2012-09-06 50 views
0

我目前的任務是連續運行一個Python程序,它將成爲一種cron作業類的東西,內部它將有每24小時更新一次的對象,然後基本上將詳細信息寫入文件中。運行連續的Python進程和內存管理

一些建議要求對內存管理

  1. 我應該使用單獨的進程或多線程。由於程序中有一個可以並行執行的範圍。因爲它將持續運行,所以需要澄清這些線程的內存消耗,我還需要在每次執行後清理線程的資源。 python中是否有可用於線程的清理方法?

  2. 當我在Python中進行對象分配時,是否還需要考慮析構函數,或者Python會執行gc。

請分享你對此的看法以及什麼是最好的方法。

+0

Python有自動內存管理。無論您是使用單個進程,多個進程還是多個線程(這兩個線程都不相同)都取決於內存方面的考慮。 – katrielalex

+0

我同意你的看法。我只是想澄清一點,對於內存我不必擔心Python。 – user1524206

+0

現在當我無限地運行這個過程時,我確實每小時都會看到內存的增加。是否發生內存泄漏? – user1524206

回答

4

在你的問題中似乎存在一個誤解。

cron作業是在給定時間間隔運行的計劃任務。除了在啓動時啓動以外,連續運行的程序不需要安排。

首先,Python中的多線程遭遇GIL,所以除非您調用多線程感知庫函數,否則您的計算受I/O限制(通常被輸入/輸出阻塞,如磁盤訪問,網絡訪問等)釋放GIL,你將只能通過使用線程獲得無形的收益。你應該考慮使用multiprocessing包進行並行計算。其他選項是使用OpenMP編譯庫或使用基於任務的並行框架(如SCOOPCelery)時基於NumPy的計算。

正如評論中所述,內存管理是用Python構建的,除了刪除未使用的實例或元素外,您不必擔心它。 Python會自動爲每個沒有任何綁定變量的元素自動收集你的程序,因此一定要刪除它們或讓它們相應地脫落。

在附註上,注意Python中的對象析構函數,它們傾向於表現出與其他面嚮對象語言不同的行爲。我建議你在使用它之前閱讀這個問題。

+1

還有一些偉大的持久化進程框架用於編寫各種各樣的守護進程。關閉我的頭頂:Twisted,Eventlet,Gevent。 –