Python:高级Python调度器 - 类Cron风格调度 - 传递函数参数
我正在尝试使用高级Python调度器来安排一个类似于cron的任务。每当我使用不需要任何参数的函数时,一切都很顺利,但当我想安排一个需要传递一个或多个参数的任务时,就遇到了问题。你能给我一些建议吗?
from apscheduler.scheduler import Scheduler
def job_def(var1, var2):
print "%s - %s" % (str(var1), str(var2))
s = Scheduler()
s.add_cron_job(job_def,['hello', 'there'], seconds='*/30')
s.start()
错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler scheduler.py", line 346, in add_cron_job start_date=start_date)
File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/__init__.py", line 44, in __init__ field = field_class(field_name, exprs, is_default)
File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/fields.py", line 29, in __init__ self.compile_expressions(exprs)
File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/fields.py", line 56, in compile_expressions self.compile_expression(expr)
File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/fields.py", line 69, in compile_expression (expr, self.name))
2 个回答
2
这样做是不是更简单呢:
s.add_interval_job(job_def,args=['hello','there'],seconds=30)
这样做不是更好么?
7
首先,根据文档,应该使用second="*/30"
,而不是seconds="*30/"
。然后,add_cron_job
的方法原型是:
def add_cron_job(self, func, year=None, month=None, day=None,
week=None, day_of_week=None, hour=None, minute=None, second=None,
start_date=None, args=None, kwargs=None, **options):
"""
Schedules a job to be completed on times that match the given
expressions.
:param func: callable to run
:param year: year to run on
:param month: month to run on
:param day: day of month to run on
:param week: week of the year to run on
:param day_of_week: weekday to run on (0 = Monday)
:param hour: hour to run on
:param second: second to run on
:param args: list of positional arguments to call func with
:param kwargs: dict of keyword arguments to call func with
:param name: name of the job
:param jobstore: alias of the job store to add the job to
:param misfire_grace_time: seconds after the designated run time that
the job is still allowed to be run
:return: the scheduled job
:rtype: :class:`~apscheduler.job.Job`
"""
所以,在你的情况下,你应该写类似这样的内容:
from apscheduler.scheduler import Scheduler
def job_def(var1, var2):
print "%s - %s" % (str(var1), str(var2))
s = Scheduler()
s.add_cron_job(job_def, args=['hello', 'there'], second='*/30')
s.start()