【问题标题】:Web2Py - configure a schedulerWeb2Py - 配置调度程序
【发布时间】:2015-08-19 00:53:23
【问题描述】:

我有一个用 Web2Py 编写的应用程序,其中包含一些模块。我需要定期从模块中调用一些函数,比如每天一次。我一直在尝试让调度程序为此目的工作,但不确定如何使其正常工作。我已经参考了thisthis 来开始使用。

我在模型目录中有一个scheduler.py 类,其中包含如下代码:

from gluon.scheduler import Scheduler
from Module1 import Module1

def daily_task():
module1 = Module1()
module1.action1(arg1, arg2, arg3)

daily_task_scheduler = Scheduler(db, tasks=dict(my_daily_task=daily_task))

default.py 我有以下调度程序代码:

def daily_periodic_task():
daily_task_scheduler.queue_task('daily_running_task', repeats=0, period=60)

[为了测试我在 60 秒后运行它,否则我计划每天使用period=86400]

在我的Module1.py 类中,我有这样的代码:

   def action1(self, arg1, arg2, arg3):
    for row in db().select(db.table1.ALL):
        row.processed = 'processed'
        row.update_record()

我面临的一个问题是,我不清楚如何让这个调度程序自动处理action1 的日常执行。 当我使用类似于python web2py.py -K my_app 的语法启动我的应用程序时,它会在控制台中显示: web2py Web Framework Created by Massimo Di Pierro, Copyright 2007-2015 Version 2.11.2-stable+timestamp.2015.05.30.16.33.24 Database drivers available: sqlite3, imaplib, pyodbc, pymysql, pg8000 starting single-scheduler for "my_app"...

但是,当我在以下位置看到浏览器时: http://127.0.0.1:8000/my_app/default/daily_periodic_task

我只是在屏幕上看到“无”作为文本显示,我没有看到我的数据库表中的计划任务产生的任何更改。

当我在以下位置看到浏览器时: http://127.0.0.1:8000/my_app/default/index

我收到一条错误消息,指出 This web page is not available,基本上表明我的应用程序从未启动。

当我使用python web2py.py 正常启动我的应用程序时,我的应用程序加载正常,但我没有在我的数据库表中看到计划任务产生的任何更改。

我无法弄清楚我在这里做错了什么以及如何正确使用 Web2Py 的调度程序。基本上,我需要知道如何正常启动我的应用程序以及在后台正常运行的计划任务。

在这方面的任何帮助将不胜感激。

【问题讨论】:

    标签: python web2py scheduler


    【解决方案1】:

    运行python web2py.py 启动内置的网络服务器,使 web2py 能够响应 HTTP 请求(即,向浏览器提供网页)。这与调度程序无关,不会导致任何调度任务运行。

    要运行计划任务,您必须通过以下方式启动一个或多个后台工作人员:

    python web2py.py -K myapp
    

    以上内容不会启动内置网络服务器,因此无法访问网页。它只是启动一个可用于执行计划任务的工作进程。

    另外,请注意,上述内容实际上不会导致任何任务被安排。要安排任务,您必须在db.scheduler_task 表中插入一条记录,您可以通过任何常用的插入记录方法(包括使用appadmin)或以编程方式通过scheduler.queue_task 方法(这就是您在您的 daily_periodic_task 操作中使用)。

    注意,您可以通过以下方式同时启动内置 Web 服务器和调度程序工作进程:

    python web2py.py -a yourpassword -K myapp -X
    

    因此,要安排每日任务并使其实际执行,您需要 (a) 启动调度程序工作程序并 (b) 安排任务。您可以通过访问 daily_periodic_task 操作来安排任务,但请注意,您只需要访问该操作一次,因为一旦安排了任务,它就会无限期地保持有效(假设您已设置 repeats=0)。

    如果任务似乎没有运行,则可能是任务本身有问题导致错误。

    【讨论】:

    • 感谢安东尼为我阐明了这些概念。我现在更好地理解它了。但是,当我重试此操作时,我在浏览器中收到此错误:<class 'gluon.contrib.pymysql.err.ProgrammingError'> (1146, u"Table 'my_db_name.scheduler_task' doesn't exist")。实际上,我之前以某种方式生成了这些表,但是我不小心丢弃了它们并且它们没有重新生成。在控制台中,我不断看到这些消息Error retrieving statusERROR:web2py.scheduler.W-MSR-1M#12188: error popping tasks。知道如何解决这个问题吗?
    • 按照link 中指定的建议,我已经能够确定我的案例中错误的根本原因。基本上,我是这样做的:“1. 确保数据库/* 文件夹中没有 _scheduler_.table 文件 2. 请求创建表...... appname/appadmin/index 很好检查桌子是否在那里。”但是,安东尼你的回答让我朝着正确的方向前进,并解决了我最初在我的问题中指定的查询:-)
    • 供其他人参考,我发现这非常有用video 以及帮助我​​解决我遇到的其他一些问题的调度程序的使用。
    • 你能解释一下在这种情况下 myapp 是什么吗?
    • myapp 是 web2py 应用程序的名称(即 web2py /applications 文件夹中其文件夹的名称)。
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多