实际上,我找不到合适的主题。我正在尝试使用Apscheduler
库。我为该库创建了一个类方法,并作为一个全新的调度程序库自己添加了一些缺少的功能。使用SQLAlchemyJobStore
时,调度程序必须所添加的函数必须是可序列化的,但是当我创建新类时,所添加的函数是该类本身的成员。例如,假设此代码:
from datetime import datetime
from time import sleep
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
class sched:
def __init__(self):
jobstores = {
'default': SQLAlchemyJobStore(url='sqlite:///test.db')
}
self.scheduler = BackgroundScheduler(jobstores=jobstores)
def add_func(self, some_func, args={}, kwargs={}):
self.scheduler.add_job(
some_func, 'interval', args=args, kwargs=kwargs, seconds=5, replace_existing=True)
def start(self):
self.scheduler.start()
def tick(self, i, j, **kwargs):
print("hello{} {}".format(i, j))
for k in kwargs:
print(k, ":", kwargs[k])
if __name__ == '__main__':
schedule = sched()
schedule.start()
schedule.add_func(schedule.tick, args=[1, 2], kwargs=dict(a=1, b=2))
# using the following three lines solve the problem
# sched = sched()
# sched.start()
# sched.add_func(sched.tick, args=[1, 2], kwargs=dict(a=1, b=2))
while True:
sleep(.1)
回溯(最近通话最近):文件 “ ... \ Python36 \ lib \ site-packages \ apscheduler \ executors \ base.py”,行 125,在run_job retval = job.func(* job.args,** job.kwargs)TypeError:tick()缺少1个必需的位置参数:'j'
此错误意味着无法对整个类进行序列化,但是如果我将我的实例命名为与类名相同(此处为sched
),它将得到修复。
在示例中,tick
函数必须本身是Schedule类的成员,因为在我的原始类scheduler.add_job
中,该类方法从类方法中获得了修改后的函数,而目前,我不不想完全编辑我的新日程表类。
我的问题是,当我想从文件导入类时,确实发生了问题。还有其他方法可以从文件中导入类吗?
答案 0 :(得分:1)
可以通过以下方式避免此问题:
schedule.add_func(sched.tick, args=[schedule, 1, 2], kwargs=dict(a=1, b=2))
但是,这要求您将调度程序移出sched
类,因为它不能与sched
类的实例一起进行序列化。
答案 1 :(得分:0)
由于无法在数据库中序列化整个类sched
,因此必须将类定义为静态。所以我将类更改为静态类。
from datetime import datetime
from time import sleep
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
class sched:
jobstores = {
'default': SQLAlchemyJobStore(url='sqlite:///test.db')
}
scheduler = BackgroundScheduler(jobstores=jobstores)
@classmethod
def add_func(cls, some_func, args={}, kwargs={}):
cls.scheduler.add_job(
some_func, 'interval', args=args, kwargs=kwargs, seconds=5, replace_existing=True)
@classmethod
def start(cls):
cls.scheduler.start()
@classmethod
def tick(cls, i, j, **kwargs):
print("hello{} {}".format(i, j))
for k in kwargs:
print(k, ":", kwargs[k])
if __name__ == '__main__':
schedule = sched()
schedule.start()
schedule.add_func(schedule.tick, args=[1, 2], kwargs=dict(a=1, b=2))
while True:
sleep(.1)