我有一个带有创建时间表的方法的类(为简化起见,它被简化了):
def create_schedule(self):
# Create a function-1 event
scheduler.add_job(self.function_1,
trigger='date',
run_date=datetime_1,
args=[self])
# Create a function-2 event
scheduler.add_job(self.function_2,
trigger='date',
run_date=datetime_2,
args=[self])
这些是function_1
和function_2
类的方法:
def function_1(self, *args):
print('self in function_1:', self)
def function_2(self, *args):
print('self in function_2:', self)
由于某种原因,当它从调度程序执行两个事件时,将显示以下内容:
self in function_1: <program.my_class object at 0x6f03e430>
self in function_2: <program.my_class object at 0x6f03e4b0>
即两者是不同的对象,因此function_1
所做的更改不会出现在function_2
中,反之亦然。
那是为什么? self
指向的所有实例不应该都一样吗?有没有办法避免这种情况,并迫使所有self
实际上指向同一实例?
答案 0 :(得分:1)
您向apscheduler
注册了两个不同的事件,它们在您的配置中存储了事件回调信息in a database in a serialized form:
作业商店存放计划的作业。默认作业存储只是将作业保存在内存中,而其他作业则将其存储在各种数据库中。 作业的数据在保存到持久性作业存储中时会序列化,在从作业中加载回来时会反序列化。
强调粗体。
您拥有的两个作业是独立执行的,因此对它们进行了反序列化,从而导致从序列化数据中创建两个新实例。
您不能依靠单独的事件来对同一实例进行操作。您需要通过添加足够的标识信息来外部化状态,以便在作业触发时重新创建状态。