Dưới đây là các chương trình:Bộ nhớ sử dụng tiếp tục phát triển với multiprocessing.pool Python của
#!/usr/bin/python
import multiprocessing
def dummy_func(r):
pass
def worker():
pass
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=16)
for index in range(0,100000):
pool.apply_async(worker, callback=dummy_func)
# clean up
pool.close()
pool.join()
tôi thấy sử dụng bộ nhớ (cả VIRT và RES) tiếp tục tăng trưởng lên đến gần()/join(), là có bất kỳ giải pháp cho thoát khỏi điều này? Tôi đã thử maxtasksperchild với 2.7 nhưng nó cũng không giúp được gì.
Tôi có một chương trình phức tạp hơn gọi hàm apply_async() ~ 6M lần và tại ~ 1,5M điểm tôi đã có 6G + RES, để tránh tất cả các yếu tố khác, tôi đã đơn giản hóa chương trình thành phiên bản cao hơn.
EDIT:
Hóa ra phiên bản này hoạt động tốt hơn, nhờ sự đầu vào của tất cả mọi người:
#!/usr/bin/python
import multiprocessing
ready_list = []
def dummy_func(index):
global ready_list
ready_list.append(index)
def worker(index):
return index
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=16)
result = {}
for index in range(0,1000000):
result[index] = (pool.apply_async(worker, (index,), callback=dummy_func))
for ready in ready_list:
result[ready].wait()
del result[ready]
ready_list = []
# clean up
pool.close()
pool.join()
Tôi không đặt bất kỳ khóa có như tôi tin rằng quá trình chính là đơn luồng (callback là nhiều hơn hoặc ít hơn như một điều hướng sự kiện cho mỗi tài liệu tôi đọc).
Tôi đã thay đổi phạm vi chỉ mục của v1 thành 1.000.000, tương tự như v2 và thực hiện một số kiểm tra - thật lạ với tôi v2 thậm chí còn nhanh hơn 10% so với v1 (33 giây so với 37 giây). v2 chắc chắn là một người chiến thắng về sử dụng bộ nhớ, nó không bao giờ vượt quá 300M (VIRT) và 50M (RES), trong khi v1 được sử dụng là 370M/120M, tốt nhất là 330M/85M. Tất cả các con số chỉ là 3 ~ 4 lần thử nghiệm, chỉ tham khảo.
Chỉ cần suy đoán ở đây, nhưng xếp hàng một triệu đối tượng chiếm không gian. Có lẽ việc sắp xếp chúng sẽ giúp ích cho bạn. Các tài liệu không dứt khoát, nhưng [ví dụ] (http://pydoc.net/Python/multiprocessing/2.6.2.1/multiprocessing.examples.mp_pool/) (tìm kiếm để gọi lại Kiểm tra) cho thấy kết quả apply_async đang được chờ đợi, ngay cả khi có callbacks. Có thể cần phải chờ để xóa hàng đợi kết quả. – tdelaney
Vì vậy, đa xử lý.pool có thể không phải là công cụ phù hợp với tôi, như gọi lại thực sự không làm công việc dọn dẹp, là nó có thể làm sạch trong gọi lại? Vấn đề là tôi không thể chờ đợi sau khi apply_async() gọi như trong công nhân thế giới thực() mất ~ 0,1 giây cho mỗi yêu cầu (một số yêu cầu HTTP). –
Dự đoán hoang dã: 'apply_asynch' tạo một thể hiện [' AsynchResult'] (http://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.AsyncResult). 'Pool' có thể có một số tham chiếu đến các đối tượng này, vì chúng phải có khả năng trả về kết quả khi tính toán đã hoàn thành, nhưng trong vòng lặp của bạn, bạn chỉ đơn giản là ném chúng đi. Có lẽ bạn nên gọi 'get()' hoặc 'wait()' trên kết quả asynch tại một số điểm, có thể sử dụng đối số 'callback' của' apply_asynch'. – Bakuriu