【发布时间】:2022-06-24 04:13:16
【问题描述】:
我正在编写一个使用 ray 包进行多处理编程的程序。在程序中,有一个函数会同时被调用 5 次。在执行期间,我想使用 PyQT5 QprogressBar 显示一个进度条来指示完成了多少工作。我的想法是让函数的每次执行都将进度条更新 20%。所以我写了如下代码:
running_tasks = [myFunction.remote(x,y,z,self.progressBar,QApplication) for x in myList]
Results = list(ray.get(running_tasks))
在 myFunction 中,有一行更新发送的进度条,如下所示:
QApplication.processEvents()
progressBar.setValue(progressBar.Value()+20)
但是,当我运行代码时,出现以下错误:
TypeError:无法序列化参数 <PyQt5.QtWidgets.QProgressBar object at 0x000001B787A36B80> 用于任务 或演员 myFile.myFunction。查看 https://docs.ray.io/en/master/serialization.html#troubleshooting 为 更多信息。
我通过互联网搜索(URL返回404),我知道这个错误是因为ray中的多处理在处理器之间没有共享内存,并且发送一个类属性(如self.prgressBar)将导致每个处理器拥有它自己的副本,它将仅在本地对其进行修改。我也尝试使用 multiprocessing 包而不是 ray 但它会引发酸洗错误,我认为这是由于相同的原因。那么,谁能确认我是对的吗?或提供有关错误的进一步解释? 另外,如果多处理在处理器之间没有共享内存,我怎样才能达到我对多处理的要求(即同时更新相同的进度条)?
标签: python parallel-processing pyqt5 multiprocessing ray