跳转到主要内容

一个用于处理异步任务的django应用程序。

项目描述

autotask是一个django应用程序,用于处理异步任务,无需安装、配置和监督额外的进程,如celeryredisrabbitmq。autotask旨在用于异步任务偶尔发生的应用程序,似乎不需要额外技术栈的安装、配置和监控。

代码可在bitbucket上获取,也可以使用以下方式安装:

pip install autotask

要求

- Python >= 3.3, 2.7
- Django >= 1.8
- Databases: PostgreSQL, SQLite3
            (MySQL and Oracle should work, but untested)

安装

使用pip下载并安装

pip install autotask

然后在settings.py中将autotask注册为应用程序

# Application definition
INSTALLED_APPS = [
    ...
    'autotask',
]

运行迁移以安装autotask使用的数据库表

$ python manage.py migrate

用法

settings.py中激活autotask

AUTOTASK_IS_ACTIVE = True

注意:在运行python manage.py migrate之前不要激活autotask。否则,autotask将尝试访问一个未定义的数据库表。

autotask提供了三个装饰器来处理异步任务

from autotask.tasks import (
    delayed_task,
    periodic_task,
    cron_task,
)

如果autotask未激活,装饰器将不会返回包装器,而是原始函数。因此,装饰器将没有任何效果,函数将表现得像未装饰一样。

@delayed_task

@delayed_task(delay=0, retries=0, ttl=300)
def some_function(*args, **kwargs):
    ...

对由@delayed_task()装饰的函数的调用将立即返回。该函数本身将在另一个进程中稍后执行。装饰器接受以下可选参数

delay:

在函数执行之前至少等待的秒数。默认为0(尽可能快)。

retries:

在函数执行失败时重试执行的次数。默认为0(不重试)。

ttl:

生存时间。在运行函数后,结果至少会保存这个时间。默认为300秒。

装饰的函数返回一个具有以下属性的对象

ready:

如果任务已执行则为True,如果任务仍在等待执行则为False。

status:

可以有以下值(可以从中导入autotask.task)

from autotask.task import (
    WAITING,
    RUNNING,
    DONE,
    ERROR
)

- WAITING: task waits for execution
- RUNNING: task gets executed right now
- DONE: task has been executed
- ERROR: an error has occured during the execution
result:

执行任务的结果。

error_message:

如果发生错误,将保存错误信息字符串。

一个典型用例是发送由请求触发的电子邮件

from autotask.tasks import delayed_task

@delayed_task()
def send_mail(receivers, message):
    # your implementation here ...

并在你的代码的其他地方

def handle_request(request):
    ...
    send_mail(receivers, message)
    ...
    return response

sendmail()的调用立即发送响应,而不等待邮件服务器完成工作。邮件本身由在另一个进程中运行的worker发送。其他示例包括图像处理或可能需要一些时间并且可以单独处理的其他任务。

@periodic_task

@periodic_task(seconds=3600, start_now=False)
def some_function(*args, **kwargs):
    ...

通过@periodic_task()装饰的函数不应被调用,而必须在启动时导入以执行装饰器的模块中定义。这将注册函数以定期执行。装饰器接受以下可选参数

seconds:

等待再次执行函数的秒数。默认为3600(一小时)。

start_now:

一个布尔值。True:尽可能快地执行,然后定期执行。False:等待给定的时间数秒后定期运行。默认为False。

这里的一个用例可能是运行一些周期性清理

from autotask.tasks import periodic_task

@periodic_task(seconds=600)
def clean_up():
    queryset = MyModel.objects.filter(obsolete=True)
    queryset.delete()

clean_up()函数不应从你的程序中调用。相反,必须在启动Django时导入定义函数的模块。这是因为装饰器在模块导入时执行,这样clean_up函数就由autotask注册,每十分钟调用一次。

@cron_task

@cron_task(minutes=None, hours=None, dow=None,
           months=None, dom=None, crontab=None)
def some_function(*args, **kwargs):
    ...

通过@cron_task()装饰的函数不应被调用,而必须在启动Django时导入以执行装饰器的模块中定义。这将注册函数根据crontab参数执行。这些参数可以作为关键字参数或作为crontab字符串的Python序列提供。

minutes:

任务应在小时内的分钟列表运行。有效的条目是0-59范围内的整数。默认为None,与crontab中的‘*’相同,表示任务每分钟执行一次。

hours:

任务应在一天内的小时列表运行。有效的条目是0-23范围内的整数。默认为None,与crontab中的‘*’相同,表示任务每小时执行一次。

dow:

星期几。一个从0到6的整数列表,星期一为0。任务只在指定的星期几运行。默认为None,与crontab中的‘*’相同,表示任务在一周中的每天执行。

months:

任务应在一年中的月份列表运行。有效的条目是1-12范围内的整数。默认为None,与crontab中的‘*’相同,表示任务每月执行一次。

dom:

任务应在一个月中的天列表运行。有效的条目是1-31范围内的整数。默认为None,与crontab中的‘*’相同,表示任务每天执行一次。

如果既没有提供 dom 也没有提供 dow,则任务将在一个月中的每一天运行。如果两者之一被设置,则应用给定的限制。如果两者都设置了,则允许的日期相互补充。

crontab:

表示有效 crontab 的字符串。请参阅:[CRON 表达式](https://en.wikipedia.org/wiki/Cron#CRON_expression)(限制为只允许整数和特殊符号(*)、(-)),以下是一些示例

The order of arguments is:
'minutes hours dow months dom'

'* * * * *':       runs every minute
                   (same as @periodic_task(seconds=60))
'15,30 7 * * *':   runs every day at 7:15 and 7:30
'* 9 0 4,7 10-15': runs at 9:00 every monday and
                   from the 10th to the 15th of a month
                   but only in April and July.

如果提供了 crontab 参数,则忽略其他所有参数。在启用 @cron_task 时,建议也安装 [pytz](http://pytz.sourceforge.net/)。

例如,使用 @cron_task 可能是发送时事通讯

from autotask.tasks import cron_task

@cron_task(crontab="30 7 0 * *")
def send_newsletter():
    # your implementation here

与 @periodic_task 装饰器类似,此函数不是从程序中调用,而必须在启动 django 时导入。函数 send_newsletter 将在每个周一早上 7:30 执行。

除了使用 crontab 参数作为字符串外,还可以使用关键字参数将调度信息提供给装饰器

@cron_task(minutes=[30], hours=[7], dow=[0])
def send_newsletter():
    # your implementation here

设置

所有设置都是可选的,并使用默认值预设。要覆盖这些默认值,请在 settings.py 文件中重新定义它们。

AUTOTASK_IS_ACTIVE:布尔值。如果为 True,则自动任务将启动一个工作进程来处理装饰的任务。默认为 False(便于安装)。

AUTOTASK_WORKER_EXECUTABLE:字符串。指向 manage.py <command> 的可执行文件的路径。必须是绝对路径或相对于由 settings.py 文件中定义的 BASE_DIR 的工作目录的相对路径。默认为无前缀路径的“python”。

AUTOTASK_WORKER_MONITOR_INTERVALL:整数。autotask 检查工作进程是否存活的时间(秒)。默认为 5。

AUTOTASK_HANDLE_TASK_IDLE_TIME:整数。空闲时间休眠的秒数。处理完一个任务后,autotask 会检查下一个任务,如果其已计划在当前时间执行,则立即执行它。如果没有找到计划中的任务,autotask 将休眠指定的时间(秒)。默认为 10。

AUTOTASK_RETRY_DELAY:整数。在发生错误后,autotask 在重新执行 @delayed_task 之前等待的秒数。错误是未处理的异常。默认为 2。

AUTOTASK_CLEAN_INTERVALL:整数。数据库清理运行之间的时间(秒)。在运行一个 @delayed_task 后,结果将至少存储给定的时间到生存期(由装饰器的 ttl 参数定义)。在此期间之后,条目将在下一次清理运行中被删除,以防止数据库中积累过时的任务。默认为 600。

这是如何工作的

对于每个 django 进程,autotask 都会启动一个相应的工作进程来处理延迟或周期性任务。工作进程被监控:如果工作进程因任何原因终止,将在几秒后重启。如果 django 进程终止,则工作进程也会终止。

处理大量延迟任务可能会给数据库增加额外的负载。这取决于应用程序,这可能是一个问题。

autotask 的目的不是尽快调用工作进程来处理传入的任务,而是将耗时和周期性工作委托出去。

版本

0.5.4

修复错误:工作进程没有正确保存错误

更多发布历史记录在 RELEASES.rst 中

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 [安装包](https://packaging.pythonlang.cn/tutorials/installing-packages/) 的更多信息。

源代码分发

autotask-0.5.4.tar.gz (17.5 kB 查看哈希值)

上传时间 源代码

支持者