我想使用matplotlib
的FuncAnimation
函数来动态更新绘图线。在计算馈送给rbfopt
的黑箱optimize
方法的目标函数后,重新绘制该行。这里是PyPi documentation以及rbfopt
的user manual
在我的例子中optimize
方法是并行的,几个Stackoverflow线程表明Process
/Queue
工作流因此需要实现以更新绘图,因为matplotlib
不是线程安全的
问题是我想将rbfopt
的optimize
方法视为“黑盒”,这意味着我不想编辑源代码。现在,我在optimize
方法的目标函数中调用queue.put
。然后在update_plot
函数中调用queue.get
,这需要在启动以rbfopt
的optimize
方法为目标的Process
后执行。以下是一些伪代码:
def obj_func(..., queue):
# run simulation that calculates new y_data for line
queue.put(results_of_simulation)
return results_of_simulation
def update_plot(..., queue):
y_data = queue.get
# set new ydata in figure
if name == '__main__':
queue = Queue()
# set up matplotlib figure
# set up settings for algorithm
# `functools`'s `partial` is used to pass `queue` to `obj_func`
bb = rbfopt.RbfoptUserBlackBox(..., obj_func)
alg = rbfopt.RbfoptAlgorithm(settings, bb)
optimization = Process(target=alg.optimize)
optimization.start() # /!\ throws error here /!\
ani = FuncAnimation(fig, update_plot, blit=True, fargs=(..., queue,))
plt.show()
optimization.join()
不幸的是Process
无法启动。我得到一个酸洗错误:
..\epcalibrator\calibration.py:94: in calibrate_model
optimization.start()
..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\process.py:112: in start
self._popen = self._Popen(self)
..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\context.py:223: in _Popen
return _default_context.get_context().Process._Popen(process_obj)
..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\context.py:322: in _Popen
return Popen(process_obj)
..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\popen_spawn_win32.py:89: in __init__
reduction.dump(process_obj, to_child)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
obj = <Process(Process-3, initial)>, file = <_io.BufferedWriter name=10>
protocol = None
def dump(obj, file, protocol=None):
'''Replacement for pickle.dump() using ForkingPickler.'''
> ForkingPickler(file, protocol).dump(obj)
E TypeError: cannot serialize '_io.TextIOWrapper' object
..\..\..\..\Anaconda3\envs\epcalibrator\lib\multiprocessing\reduction.py:60: TypeError
我无法理解错误所指的文件。以前是否有人能够使用并行黑盒优化器动态绘制结果
目前没有回答
相关问题 更多 >
编程相关推荐