python中uss的用法_使用不同内存ussag管理Python多进程进程进程
我認為試圖捕捉并從OOM錯誤中恢復是非常困難的,如果不是不可能的話。你需要一個線程或進程來持續監控內存使用情況,當它檢測到內存使用量太高時,會……確切地說是什么?終止正在處理任務的進程?嘗試暫停它(如果可能的話;它可能不取決于你的任務在做什么)。即使這樣,暫停也不會釋放任何記憶。當任務安全時,你必須釋放內存并重新啟動任務,這意味著你必須重新排隊,決定何時安全,等等
與其嘗試檢測并從中恢復過來,我建議盡量避免它。創建兩個隊列和兩個池。一個隊列/池用于高內存任務,另一個隊列/池用于低內存任務。高內存池中只有一個進程,因此它只能并發運行一個任務,這樣可以節省內存。低內存隊列將有multiprocessing.cpu_count() - 1個進程,允許您在兩個池中保持cpu飽和。在
這種方法的一個潛在問題是,如果您耗盡了高內存隊列,同時仍有低內存任務等待處理,那么您將浪費一個CPU。您可以以非阻塞的方式(或使用超時)處理高內存隊列中的這種消耗,以便在準備使用任務時,如果高內存隊列為空,則可以獲取低內存任務。然后當您完成處理后,再次檢查高內存隊列。在
像這樣:import multiprocessing
# hi_q and lo_q are placeholders for whatever library you're using to consume from RabbitMQ
def high_mem_consume():
while True:
task = hi_q.consume(timeout=2)
if not task:
lo_q.consume(timeout=2)
if task:
process_task(task)
def low_mem_consume():
while True:
task = lo_q.consume() # Blocks forever
process_task(task)
if __name__ == "__main__":
hi_pool = multiprocessing.Pool(1)
lo_pool = multiprocessing.Pool(multiprocessing.cpu_count() - 1)
hi_pool.apply_async(high_mem_consume)
lo_pool.apply_async(lo_mem_consume)
總結
以上是生活随笔為你收集整理的python中uss的用法_使用不同内存ussag管理Python多进程进程进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为nova5ipro的优缺点_华为no
- 下一篇: python阻塞和非阻塞_Python基