python中uss的用法_使用不同内存ussag管理Python多进程进程进程
我認(rèn)為試圖捕捉并從OOM錯(cuò)誤中恢復(fù)是非常困難的,如果不是不可能的話。你需要一個(gè)線程或進(jìn)程來(lái)持續(xù)監(jiān)控內(nèi)存使用情況,當(dāng)它檢測(cè)到內(nèi)存使用量太高時(shí),會(huì)……確切地說(shuō)是什么?終止正在處理任務(wù)的進(jìn)程?嘗試暫停它(如果可能的話;它可能不取決于你的任務(wù)在做什么)。即使這樣,暫停也不會(huì)釋放任何記憶。當(dāng)任務(wù)安全時(shí),你必須釋放內(nèi)存并重新啟動(dòng)任務(wù),這意味著你必須重新排隊(duì),決定何時(shí)安全,等等
與其嘗試檢測(cè)并從中恢復(fù)過(guò)來(lái),我建議盡量避免它。創(chuàng)建兩個(gè)隊(duì)列和兩個(gè)池。一個(gè)隊(duì)列/池用于高內(nèi)存任務(wù),另一個(gè)隊(duì)列/池用于低內(nèi)存任務(wù)。高內(nèi)存池中只有一個(gè)進(jìn)程,因此它只能并發(fā)運(yùn)行一個(gè)任務(wù),這樣可以節(jié)省內(nèi)存。低內(nèi)存隊(duì)列將有multiprocessing.cpu_count() - 1個(gè)進(jìn)程,允許您在兩個(gè)池中保持cpu飽和。在
這種方法的一個(gè)潛在問(wèn)題是,如果您耗盡了高內(nèi)存隊(duì)列,同時(shí)仍有低內(nèi)存任務(wù)等待處理,那么您將浪費(fèi)一個(gè)CPU。您可以以非阻塞的方式(或使用超時(shí))處理高內(nèi)存隊(duì)列中的這種消耗,以便在準(zhǔn)備使用任務(wù)時(shí),如果高內(nèi)存隊(duì)列為空,則可以獲取低內(nèi)存任務(wù)。然后當(dāng)您完成處理后,再次檢查高內(nèi)存隊(duì)列。在
像這樣: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)
總結(jié)
以上是生活随笔為你收集整理的python中uss的用法_使用不同内存ussag管理Python多进程进程进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为nova5ipro的优缺点_华为no
- 下一篇: 嵌入式开发有年龄限制吗_广东成人高考报考