计划任务
Masonite 提供了一种非常简单的方式来运行周期性任务。任务可以很简单,例如每分钟清理一次数据库表的记录,在数据库之间同步记录,在每个月底发送发票。它们是你需要按计划运行的那些自动重复任务,例如每分钟、每小时、每天、每月或两者之间的任何时间。
创建任务
任务是你用来注册到 Masonite 调度程序的内容,它知道要运行哪些任务以及运行频率。
要创建任务,只需运行以下命令:
$ python craft task SendInvoices
这将创建一个如下所示的任务:
from masonite.scheduling import Task
class SendInvoices(Task):
def handle(self):
pass
您可以更改任务以执行您需要执行的任何操作:
from masonite.scheduling import Task
class SendInvoices(Task):
def handle(self):
users = User.have_invoices().get()
for user in users:
# 发送发票给用户
pass
注册任务
然后,你必须将任务注册到 Masonite 调度程序。你可以在你的应用程序中轻松地做到这一点
Service Provider (如果你没有,你应该创建一个):
from app.tasks.SendInvoices import SendInvoices
class AppProvider(Provider):
def register(self):
self.application.make('scheduler').add(
SendInvoices().daily()
)
任务将按照您使用时间选项指定的运行频率运行。
Options
你可以根据需要指定要运行的任务。 可用的选项是:
Option | Description |
---|---|
every_minute() |
指定此任务每分钟运行一次 |
every_15_minutes() |
指定此任务每 15 分钟运行一次 |
every_30_minutes() |
指定此任务每 30 分钟运行一次 |
every_45_minutes() |
指定此任务每 45 分钟运行一次 |
hourly() |
指定此任务每小时运行一次 |
daily() |
指定此任务在每天午夜运行 |
weekly() |
指定此任务每周日 00:00 运行 |
monthly() |
指定此任务在每月的第一天 00:00 运行 |
at(17) |
指定运行作业的时间。可以与其他选项一起使用,例如daily() |
run_every('7 minutes') |
指定运行的时间量。可以是任意时间组合,例如7 months , 4 days , 3 weeks |
daily_at(17) |
每天在指定时间运行。时间为 24 小时制。8 是“上午 8 点”,17 是“下午 5 点”。 |
at_twice([8,17]) |
早上 8 点和下午 5 点运行 |
运行任务
为了运行所有已注册的任务,执行以下命令,将根据计算机/服务器的时间去发现和运行需要执行的任务:
$ python craft schedule:run
要仅运行特定的注册任务,我们可以使用--task
选项:
$ python craft schedule:run --task MyTask
最后,我们可以强制任务立即运行,我们可以使用--force
选项。这在本地开发时特别有用。
$ python craft schedule:run --task MyTask --force
定时任务
设置 Cron 作业仅适用于基于 UNIX 的机器,例如 Mac 和 Linux。 Windows 有一个类似的计划,称为任务计划程序,它很相似,但在设置时需要不同的说明。
尽管上面的schedule:run
命令很有用且需要,但我们仍然需要一种方法来每分钟运行它。我们可以通过服务器上的 cronjob 来做到这一点
我们将向您展示一个示例 cron 作业,然后我们将介绍如何构建它。
PATH=/Users/Masonite/Programming/project_name/venv/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Python.framework/Versions/3.7/bin
* * * * * cd /Users/Masonite/Programming/project_name && source venv/bin/activate && python craft schedule:run
获取路径
当 cron 作业运行时,它通常会使用 /bin/sh 命令而不是通常的 /bin/bash 来运行命令。因此,在机器上可能找不到craft,所以我们需要告诉cron作业应该加载的PATH。我们可以通过转到我们的项目目录并运行来简单地找到PATH:
$ env
这将显示类似以下内容的输出:
...
__CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0
PATH=/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Python.framework/Versions/3.7/bin
PWD=/Users/Masonite/Programming/masonite
...
如果您使用虚拟环境进行开发,那么您需要在虚拟环境中运行
env
命令。
然后我们可以复制 PATH 并将其放入 cron 作业中。
要进入 cron,只需运行:
$ env EDITOR=nano crontab -eqcszae3zd4rfdsxs
并粘贴我们刚刚复制的PATH
。一旦我们这样做了,我们的 cron 应该如下所示:
PATH=/Users/Masonite/Programming/masonitetesting/venv/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Python.framework/Versions/3.7/bin
退出nano,现在我们只需要设置实际的 cron 作业:
设置 Cron 任务
现在我们只需要设置 cron 任务本身。这就像复制它并再次将其粘贴到 nano 编辑器中一样简单。不过,您可能需要更改一些内容。
第一个* * * * *
部分是必须的,基本上意味着“默认情况下每分钟运行一次”。下一部分是你应用程序的位置,这取决于你安装 Masonite 应用程序的位置。
下一部分取决于您的设置。如果您有虚拟环境,则需要通过将&& source venv/bin/activate
附加到 cron 任务来激活它。如果您不在虚拟环境中运行,则可以忽略该部分。
最后,我们需要运行 schedule 命令,以便我们可以附加&& craft schedule:run
很好!现在我们有一个 cron 作业,它将每分钟运行一次 craft 命令。 Masonite 将决定需要执行哪些类。
你必须向 Masonite 调度程序注册任务。你可以在你的应用程序内轻松地完成这个步骤。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。