django-gearman-commands 轻量级gearman调用工具

  • 发布于: 18 October 2018
  • 编辑: 628财经

 安装模块

pip install django-gearman-commands

项目描述

django-gearman-commands 是Django管理命令和基类的集合,旨在简化Django的开发和提交Gearman job服务的相关过程。

但该项目属于轻量级的gearman应用,如果项目要求较复杂,建议直接使用原生的gearman服务。

关于Gearmanclient客户端:

需要完成的job,这是一个web应用。

server服务端:接收job并提交给workers处理。

worker作业端:询问是否有job,并处理job。worker可独立运行任务。

生产环境中,最好有两个worker来确保高可用。

 

为什么要使用 django-gearman-commands?

django-gearman-commands解决的主要问题是编写worker,为你的Django APP 使用。

django-gearman-commands 提供了什么?

为你的worker是提供基础的类

GearmanWorkerBaseCommand可以代替哪些低级的API

提交任务更简单

gearman_submit_job 命令 可以提交新的任务到gearmand,不用自己编写worker,也不用使用manage.py的提交命令。

安装

你肯定现有一个Django的应用,并希望安装Django-gearman-commands,这是一个标准的Django应用程序,但他不提供任何的models,views和urls,他只包含少数的类,自定义管理命令和测试

只有一个新的依赖项添加到你的应用程序中,python-gearman API:

$ pip install -e git://github.com/fwenzel/django-gearman.git#egg=django-gearman

另外有一个可选的依赖项,用来输出更好看的服务端信息。

$ pip install prettytable==0.5

最后添加django-gearman-commands  到你的setting的INSTALL中

INSTALLED_APPS = (
       # ...installed apps...
       'django_gearman_commands',
)

以及gearman的服务端配置

GEARMAN_SERVERS = ['127.0.0.1:4730']

编写worker

django_gearman_commands.GearmanWorkerBaseCommand 是一个基类,跟常规的gearman worker一样,所以你还是要编写自定义的部分。

假设我们想编写一个worker来导入一些耗时长,复杂度搞的数据,先在你的Django app 的management/commands路径下创建gearman_worker_data_import.py。

# -*- coding: utf-8 -*-
import django_gearman_commands

class Command(django_gearman_commands.GearmanWorkerBaseCommand):
   """执行导入数据的工作"""

   @property
   def task_name(self):
       return 'data_import'

   def do_job(self, job_data):
       # 执行复杂的数据输入
       your_code_performing_job_logic()

就想你看到的,你需要做三件事:

  • 创建文件 ‘management/commands/gearman_worker_MY_TASK_NAME.py’ 

  • 创建 Command class inheriting from django_gearman_commands.GearmanWorkerBaseCommand 这个类

  • 修改 task_name 属性 and do_job() method(方法)

task_name 是任务的唯一标识,通过发送task_name以及可选的参数来完成任务的提交。

do_job() 是在提交job时调用的方法,如果使用参数提交,则job_data 不为 None

运行worker

$ ./manage.py gearman_worker_data_import

worker将启动,并将自己注册到server中,等待job的提交。

提交jobs

$ ./manage.py gearman_submit_job data_import

Submitting job: data_import, job data: (empty).
Job submission done, result: <GearmanJobRequest task='data_import', unique='8e610a031cef8aaf50c30f451d77808d', priority=None, background=True, state='CREATED', timed_out=False>.

默认情况下,job都是在后台提交的,‘gearman_submit_job’不会等待job的完成,你可以使用--foreground 参数,更多信息请查看 ./manage.py gearman_submit_job –help,如果过程没有问题,你的your_code_performing_job _logic,将在后台运行。

从crontab提交任务的方法如下:

*/5 * * * * /path-to-your-virtualenv/bin/python /path-to-your-project/manage.py gearman_submit_job data_import

 自定义的提交方法如下:

from django.core.management import call_command

def some_view(request):
    # ....处理view的逻辑....
    # 提交job到队列
    call_command('gearman_submit_job', 'data_import')

 通过使用job提交包装器命令'gearman_submit_job',您现在可以使用相同的API从console,cron和您的应用程序提交作业。

任务命令空间

比如,同一个django项目会有多个实例,在这种情况下,你可以将GEARMAN_CLIENT_NAMESPACE添加到django的setting中,以唯一的项目表示提交任务:

GEARMAN_CLIENT_NAMESPACE = 'MyCustomer1'

Gearman 服务端信息 #这是一个非常好用的监控gearmanworker的工具,即使没有使用该模块,也可以用这个工具监控gearman。

gearman_server_info输出Gearman服务器的当前状态。如果您安装了prettytable依赖项,那么输出如下所示:

$ ./manage.py gearman_server_info
+---------------------+------------------------+--------------------+
| Gearman Server Host | Gearman Server Version | Ping Response Time |
+---------------------+------------------------+--------------------+
|    127.0.0.1:4730   |        OK 1.1.3        | 0.0006051063537598 |
+---------------------+------------------------+--------------------+.

+---------------+---------------+--------------+-------------+
|   Task Name   | Total Workers | Running Jobs | Queued Jobs |
+---------------+---------------+--------------+-------------+
| data_unlock   |       1       |      0       |      0      |
| data_import   |       1       |      1       |      0      |
| cache_cleanup |       1       |      0       |      0      |
+---------------+---------------+--------------+-------------+.

+-----------+------------------+-----------+-----------------+
| Worker IP | Registered Tasks | Client ID | File Descriptor |
+-----------+------------------+-----------+-----------------+
| 127.0.0.1 |   data_unlock    |     -     |        35       |
| 127.0.0.1 |   data_import    |     -     |        36       |
| 127.0.0.1 |  cache_cleanup   |     -     |        37       |
+-----------+------------------+-----------+-----------------+

 

如果你有很多worker,你可以使用命令参数过滤输出(区分大小写):

$ ./manage.py gearman_server_info cleanup
+---------------------+------------------------+--------------------+
| Gearman Server Host | Gearman Server Version | Ping Response Time |
+---------------------+------------------------+--------------------+
|    127.0.0.1:4730   |        OK 1.1.3        | 0.0006871223449707 |
+---------------------+------------------------+--------------------+.

+---------------+---------------+--------------+-------------+
|   Task Name   | Total Workers | Running Jobs | Queued Jobs |
+---------------+---------------+--------------+-------------+
| cache_cleanup |       1       |      0       |      0      |
+---------------+---------------+--------------+-------------+.

+-----------+------------------+-----------+-----------------+
| Worker IP | Registered Tasks | Client ID | File Descriptor |
+-----------+------------------+-----------+-----------------+
| 127.0.0.1 |  cache_cleanup   |     -     |        37       |
+-----------+------------------+-----------+-----------------+

 

使用Supervisor进行实际生产部署

在生产环境中,你需要确认两件事

1、你的Gearman server 是在运行的

2、你的Worker是在运行的

Supervisor - http://supervisord.org/ 流程的保姆。它允许您启动,重新启动和监视正在运行的进程。