Tôi đang làm việc trên renderfarm và tôi cần khách hàng của mình có thể khởi chạy nhiều phiên bản của trình kết xuất, không chặn để khách hàng có thể nhận lệnh mới. Tôi đã nhận được rằng làm việc một cách chính xác, tuy nhiên tôi đang gặp khó khăn chấm dứt quá trình tạo ra.python multiprocessing pool chấm dứt
Ở cấp độ toàn cầu, tôi xác định hồ bơi của tôi (vì vậy mà tôi có thể truy cập nó từ bất kỳ chức năng):
p = Pool(2)
sau đó tôi gọi renderer của tôi với apply_async:
for i in range(totalInstances):
p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()
Đó hoạt động kết thúc , khởi chạy các tiến trình trong nền và chờ các lệnh mới. Tôi đã thực hiện một lệnh đơn giản sẽ giết khách hàng và ngừng hiển thị:
def close():
'close this client instance'
tn.write ("say "+USER+" is leaving the farm\r\n")
try:
p.terminate()
except Exception,e:
print str(e)
sys.exit()
sys.exit()
Nó dường như không đưa ra lỗi (nó sẽ in lỗi), con trăn chấm dứt nhưng các quy trình nền vẫn còn đang chạy. Bất cứ ai có thể giới thiệu một cách tốt hơn để kiểm soát các chương trình đưa ra?
Hãy thử bật tính năng ghi nhật ký gỡ lỗi bằng 'từ công cụ nhập đa xử lý; util.get_logger(). setLevel (util.DEBUG) 'và dán đầu ra. – schlamar
Tôi đã nhìn thấy hành vi như thế này trước đây nhưng không thể tái tạo nó bây giờ ... Tôi tự hỏi, nếu gọi p.join() sẽ giúp sau khi gọi p.terminate()? Tôi cũng tự hỏi, nếu bạn thậm chí cần phải gọi chấm dứt và nếu chỉ làm sys.exit() sẽ đúng cách thu gom rác thải hồ bơi và tất cả các quy trình của nó. – mdscruggs
khi tôi cố gắng kích hoạt tính năng ghi nhật ký, tôi nhận được điều này trong bảng điều khiển: "Không xử lý được bộ xử lý" để xử lý đa ". Không may, p.join() sau p.terminate() không tạo sự khác biệt và sys .exit() đóng con trăn nhưng để lại các tiến trình đang chạy ẩn. – tk421storm