2016-01-19 13 views
5

Khi tôi chạy mã bên dưới, bộ nhớ ngày càng tăng. Tuy nhiên, nếu tôi đã xóa time.sleep(3), thì đó là 0.1 trong top và không bao giờ tăng lên.Python - tại sao time.sleep lại gây ra rò rỉ bộ nhớ?

Có vẻ như process không bị chấm dứt chính xác, nhưng tại sao?

Mã (Python 2.7.11):

import time 
import multiprocessing 

def process(): 
    #: FIXME 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 
+0

@vks tài liệu chính thức cho biết 'Người ta phải gọi close() hoặc chấm dứt() trước khi sử dụng join() 'https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing. Pool.join – tanglong

+2

Câu hỏi sau có thể thú vị cho bạn: http: //stackoverflow.com/questions/7648967/python-multiprocessing-how-to-release-memory-when-a-process-is-done Kiểm tra câu trả lời bằng cách user1914881: "Hãy thử thiết lập đối số maxtasksperchild trên hồ bơi. Nếu không, thì quá trình này được lặp lại nhiều lần bởi hồ bơi để bộ nhớ không bao giờ được giải phóng. Khi được đặt, quá trình sẽ được phép chết và một cái được tạo ra ở chỗ của nó. Điều đó sẽ làm sạch bộ nhớ một cách hiệu quả. " Các quy trình dường như chứa một chút bộ nhớ không bao giờ được phát hành trong vòng lặp 1 của bạn. (Mặc dù tôi không chắc chắn) –

+0

@RobinSpiess Tôi đã cố gắng 'maxtasksperchild', nhưng không giúp đỡ – tanglong

Trả lời

1

Theo như tôi biết, tôi nghĩ rằng khi bạn sinh ra quy trình mới trong cùng một hồ bơi, các thu gom rác thải không bao giờ được thực hiện, do đó bạn không giải phóng bộ nhớ từ các quy trình cũ, ngay cả khi bạn sử dụng chúng. Một sửa chữa sẽ được thi hành thu gom rác thải trong vòng lặp while của bạn:

import time 
import multiprocessing 
import gc 

def process(): 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
     gc.collect() 
    pool.close() 
    pool.join() 


if __name__ == '__main__': 
    main() 

này cố định rò rỉ bộ nhớ đối với tôi, như bạn buộc thu gom rác thải trước khi tung ra một bộ quy trình. Tôi hy vọng một người nào đó có thể giải thích một cách chi tiết hơn lý do behing rò rỉ bộ nhớ này.

+0

Cảm ơn, nó có lợi. – tanglong

Các vấn đề liên quan