文章内容

2019/1/15 22:41:05,作 者: 黄兵

Apscheduler TypeError: func must be a callable or a textual reference to one

最近在使用Apscheduler的时候报如下错误:

● SMS_Receive_Redis.service - Process Redis data on the SMS_Receive website.

   Loaded: loaded (/etc/systemd/system/SMS_Receive_Redis.service; enabled; vendor preset: enabled)

   Active: failed (Result: exit-code) since Tue 2019-01-15 22:05:33 CST; 9min ago

  Process: 28834 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)

  Process: 17445 ExecStart=/usr/bin/env python Anti_Web_Scraping.py (code=exited, status=1/FAILURE)

 Main PID: 17445 (code=exited, status=1/FAILURE)


Jan 15 22:05:33 VM-102-216-ubuntu env[17445]:   File "/var/SMS_Receive/venv/lib/python3.5/site-packages/apscheduler/schedulers/base.py", line 430, in add_job

Jan 15 22:05:33 VM-102-216-ubuntu env[17445]:     job = Job(self, **job_kwargs)

Jan 15 22:05:33 VM-102-216-ubuntu env[17445]:   File "/var/SMS_Receive/venv/lib/python3.5/site-packages/apscheduler/job.py", line 45, in __init__

Jan 15 22:05:33 VM-102-216-ubuntu env[17445]:     self._modify(id=id or uuid4().hex, **kwargs)

Jan 15 22:05:33 VM-102-216-ubuntu env[17445]:   File "/var/SMS_Receive/venv/lib/python3.5/site-packages/apscheduler/job.py", line 166, in _modify

Jan 15 22:05:33 VM-102-216-ubuntu env[17445]:     raise TypeError('func must be a callable or a textual reference to one')

Jan 15 22:05:33 VM-102-216-ubuntu env[17445]: TypeError: func must be a callable or a textual reference to one

Jan 15 22:05:33 VM-102-216-ubuntu systemd[1]: SMS_Receive_Redis.service: Main process exited, code=exited, status=1/FAILURE

Jan 15 22:05:33 VM-102-216-ubuntu systemd[1]: SMS_Receive_Redis.service: Unit entered failed state.

Jan 15 22:05:33 VM-102-216-ubuntu systemd[1]: SMS_Receive_Redis.service: Failed with result 'exit-code'.

看一下调用的代码:
if __name__ == '__main__':
    # 实例化一个调度器
    scheduler = BlockingScheduler()

    scale_ip = Anti_Web_Scraping()
    clean_counter = Save_Redis_Original_Data()
    # 添加任务并设置触发方式为2小时执行一次
    scheduler.add_job(scale_ip.get_counter(), 'interval', seconds=7200)
    # 每天6:00执行
    scheduler.add_job(clean_counter.clean_counters(), 'cron', hour=6, minute=00)
    # 开始运行调度器
    scheduler.start()
get_counter()函数代码如下:
def get_counter(self):
    conn = Conn_Config().Conn_Redis()
    get_visit_time_line = conn.lrange('visit_time_line', 0, -1)
    for index, precision_item in enumerate(self.PRECISION):
        visit_counter = self.VISIT_COUNTER[index]
        Anti_Web_Scraping.cycle(self, get_visit_time_line, conn, precision_item, visit_counter)
出现这个问题的原因是:
在调用get_counter()的时候,将返回值传递个add_job(),需要传递函数本身,而不是传递函数结果。
 
解决方案:
修改源代码:
if __name__ == '__main__':
    # 实例化一个调度器
    scheduler = BlockingScheduler()

    scale_ip = Anti_Web_Scraping()
    clean_counter = Save_Redis_Original_Data()
    # 添加任务并设置触发方式为2小时执行一次
    scheduler.add_job(scale_ip.get_counter, 'interval', seconds=7200)
    # 每天6:00执行
    scheduler.add_job(clean_counter.clean_counters, 'cron', hour=6, minute=00)
    # 开始运行调度器
    scheduler.start()
之后再次运行,问题解决。


参考资料:Apscheduler runs once then throws TypeError


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - Apscheduler TypeError: func must be a callable or a textual reference to one

分享到:

发表评论

评论列表