Có cách nào đơn giản để sử dụng Multiprocessing để làm tương đương với điều này không?Xử lý đa nhân Python - áp dụng phương pháp lớp vào danh sách các đối tượng
for sim in sim_list:
sim.run()
nơi các yếu tố của sim_list là "mô phỏng" các đối tượng và run() là một phương pháp của lớp mô phỏng mà không sửa đổi các thuộc tính của các đối tượng. Ví dụ:
class simulation:
__init__(self):
self.state['done']=False
self.cmd="program"
def run(self):
subprocess.call(self.cmd)
self.state['done']=True
Tất cả các sim trong sim_list đều độc lập, vì vậy chiến lược không phải là chủ đề an toàn.
Tôi đã thử những điều sau, điều này rõ ràng là thiếu sót bởi vì đối số được truyền qua sâu và không được sửa đổi tại chỗ.
from multiprocessing import Process
for sim in sim_list:
b = Process(target=simulation.run, args=[sim])
b.start()
b.join()
Bạn không muốn tham gia() vào các quy trình của bạn trong vòng lặp, hoặc bạn sẽ chạy chúng sau cái khác thay vì song song. Để trả lời câu hỏi của bạn, bạn có thể gửi một đối tượng multiprocessing.Queue khi bắt đầu Process và sau đó đặt self vào hàng đợi khi hoàn thành. –
Ok để nhận xét về join(). Về việc sử dụng Hàng đợi, tôi không chắc chắn cách thức này được cho là hoạt động. Chẳng phải đối tượng sim của tôi sẽ được truyền qua sâu không? – calys
@calys Trên cửa sổ, bạn sẽ nhận được một 'PicklingError' vì bạn đang cố gắng để chọn một phương pháp, trên UNIX không có" deepcopy ", chỉ đơn giản là mỗi quá trình có được một bản sao hoàn hảo của toàn bộ không gian địa chỉ. Bạn phải thay thế sự thay đổi trạng thái trong cá thể bằng một số giao tiếp interprocess rõ ràng. – Bakuriu