synchronized 函数keras_tuner.synchronized(func, )
用于同步 Oracle 函数的多线程调用的装饰器。
在并行调优中,可能会有多个线程并发地向 Oracle 方法(如 create_trial()、update_trial() 和 end_trial())发起 gRPC 调用。为避免并发写入数据,请使用 @synchronized 来确保调用是同步的,一次只允许一个调用运行。
对不同的 Oracle 对象进行的并发调用不会相互阻塞。对同一个 Oracle 对象的相同或不同函数进行的并发调用会相互阻塞。
您可以装饰子类函数,该函数会覆盖基类中已装饰的函数,而无需担心造成死锁。但是,该装饰器仅支持类中的方法,不能应用于独立函数。
您无需装饰 Oracle.populate_space(),因为它只会被已装饰的 Oracle.create_trial() 调用。
示例
class MyOracle(keras_tuner.Oracle):
@keras_tuner.synchronized
def create_trial(self, tuner_id):
super().create_trial(tuner_id)
...
@keras_tuner.synchronized
def update_trial(self, trial_id, metrics, step=0):
super().update_trial(trial_id, metrics, step)
...
@keras_tuner.synchronized
def end_trial(self, trial):
super().end_trial(trial)
...