Tôi đang sử dụng chức năng đa xử lý python để ánh xạ một số chức năng trên một số thành phần. Một cái gì đó dọc theo dòng này:Tại sao công nhân đa xử lý Python không chết?
def computeStuff(arguments, globalData, concurrent=True):
pool = multiprocessing.Pool(initializer=initWorker, initargs=(globalData,))
results = pool.map(workerFunction, list(enumerate(arguments)))
return results
def initWorker(globalData):
workerFunction.globalData = globalData
def workerFunction((index, argument)):
... # computation here
Nói chung tôi chạy thử nghiệm trong ipython sử dụng cả hai CPython và PyPy. Tôi đã nhận thấy rằng các quá trình sinh sản thường không bị giết, do đó, họ bắt đầu tích lũy, từng sử dụng một gig của ram. Điều này xảy ra khi nhấn ctrl-k trong quá trình tính toán, điều này sẽ gửi đa xử lý thành một sự bối rối lớn. Nhưng ngay cả khi để kết thúc tính toán, các quy trình đó sẽ không chết trong Pypy.
Theo tài liệu, khi hồ bơi bị thu gom rác, cần gọi terminate()
và tiêu diệt tất cả các quy trình. Điều gì đang xảy ra ở đây? Tôi có phải gọi một cách rõ ràng close()
không? Nếu có, có một số loại trình quản lý ngữ cảnh quản lý đúng cách đóng tài nguyên (tức là quy trình) không?
Đây là trên Mac OS X Yosemite.
upvote cho tiêu đề tư bản thực sự – percusse
Có thể bạn chỉ cần thêm '' try: ... final: pool.terminate() ''? –
Có lẽ câu hỏi của tôi không rõ ràng - Tôi đang nói rằng người lao động ở lại ngay cả khi tính toán kết thúc. Mặc dù họ không nên, nếu tôi hiểu tài liệu một cách chính xác, trong mọi trường hợp. – Ant6n