从主web服务器卸载任务的简单django应用程序

django-leek的Python项目详细描述


django韭菜

logo

构建状态代码覆盖率

在django中运行异步任务的简单的灵活的方法。

  • Django友好型API
  • 易于启动和停止

基于django队列 为什么?

健康的蔬菜搭配,比如芹菜和胡萝卜,能带来什么?

迄今为止最"轻量级"的库的第一步是"安装redis"。尽管redis是一个很棒的软件,但有时你只需要一种简单的方法来卸载web服务器并异步运行任务,比如发送电子邮件。

在这里,django leek来拯救我们。使用和结构再简单不过了,而且运动部件如此之少,它应该非常稳定,尽管它还没有像芹菜那样经过实战测试。

使用django leek,您可以快速启动并运行更复杂的分布式队列,直到网站有大量流量,并且确实需要可伸缩性。

开始

  1. 用pip安装django leek

    $ pip install django-leek
    
  2. settings.py文件中添加django leek已安装的应用程序中。

  3. 创建所需的表

    $ manange.py migrate
    
  4. 确保django leek服务器正在运行。

    $ python manage.py runleek
    
  5. 发疯

    leek=Leek()@leek.taskdefsend_mail(to):do_what_ever()send_mail.offload(to='foobar@example.com')

    您也可以使用django queue中的"old"(旧)队列

    push_task_to_queue(send_mail,to='foobar@example.com')
  6. 很容易对生产中卸载到leek服务器的代码进行单元测试。

    def_invoke(a_callable,*args,**kwargs):
  7. < > >
    • 可呼叫(*args,**kwargs) @补丁('django_leek.api.push_task_to_queue',u invoke) def test_mytest(): send_mail.offload(to='sync@leek.com')现在与普通函数一样同步运行 '

    开发

    在django leek上开发时,可以使用一个测试应用程序。例子:

    1. /manage.sh测试应用程序运行服务器-启动测试应用程序
    2. /manage.sh测试应用程序leek-启动测试应用程序的leek实例
    3. /manage.sh django_leek测试-运行测试套件。
    4. < > >

      技术概述

      简而言之,python socketserver在后台运行,监听tcp套接字。socketserver从其套接字获取运行任务的请求,并将该任务置于队列中。工作线程从该队列中选取任务,并逐个运行这些任务。

      部件

      1. 监听TCP套接字的Python SocketServer。
      2. 工作线程。
      3. python队列
      4. < > >

        工作流程

        运行异步任务的工作流:

        1. socketserver启动时,它初始化worker线程。
        2. socketserver监听请求。
        3. socketserver接收到一个请求(带有args和kwargs的可调用函数)时,它会将请求放到python队列中。
        4. 工作线程从队列中选择任务
        5. 工作线程运行任务。
        6. < > >

          这个队列可以扩展到生产吗?

          取决于流量:socketserver很简单,但是很稳定,而且随着站点获得更多流量,可以将django队列服务器移动到另一台计算机、单独的数据库等。在某个时候,可能最好选择芹菜。在此之前,django leek是一种简单、固体且无需催促的解决方案。

          设置

          要更改默认的django队列设置,请将leekdictionary添加到项目mainsettings.py文件中。

          这是字典和默认值:

          LEEK = {
          	'bind': "localhost:8002",
           	'host': "localhost",
           	'port': 8002}
          

          绑定 韭菜服务器将绑定在这里。

          主机 当通知leek作业时,django服务器将连接到此主机。

          端口 当通知leek作业时,django服务器将连接到此端口。

          持久性

          使用以下型号。

          队列任务
          模型保存推送到队列的所有任务。
          任务被pickle为一个tasks\u queue.tasks.task对象,它是一个简单的类,具有可调用的参数kwargs属性,以及一个方法:run()

          成功的任务
          工作线程将成功执行的每个任务的任务id保存到该模型中。任务ID是任务的队列任务ID。

          失败的任务
          在工作进程尝试运行任务,但引发异常失败后,工作进程将其保存到该模型中。失败的tak通过任务id保存,并显示异常消息。只保存上次运行的异常。

          清除任务

          根据您的项目需要,您可以清除工作人员成功完成的任务。

          删除这些任务的SQL:

          DELETE queued,success
          FROM tasks_queue_queuedtasks queued
          INNER JOIN tasks_queue_successtasks success
          ON success.task_id = queued.id;
          

          以类似的方式,删除失败的任务。 您可以运行cron脚本或其他脚本来清除任务。

          发布新版本

          1. 签出主分支

          2. 确保虚拟环境已激活。源venv/bin/activate

          3. 确保setup.py中的版本正确。grep version setup.py

          4. 确保安装工具、捆绳和车轮均已安装且为最新版本

            pip install "setuptools>=38.6.0" "twine>=1.11.0" "wheel>=0.31.0"
            
          5. 清除所有旧的dist包。rm-r dist/

          6. 建立源和车轮距离。python setup.py sdist bdist_wheel

          7. 上载到PYPI捆绳上载dist/*

          8. 利润!

          9. < > >

            作者

            Aviah、Silvia Scalisi和Samuel Carlsson

            有关完整列表,请参见贡献者

            欢迎加入QQ群-->: 979659372 Python中文网_新手群

            推荐PyPI第三方库


热门话题
servlets Java EE+GlassFish:如果用户在其他地方登录,则强制用户注销   java在不更改源代码的情况下添加钩子   安卓 Java TextView Onclick()返回表达式错误   java Excel文件未使用Apache存储内部内存   java getRowCount()和getSelectedColumn()不起作用   无法在java中生成视图绑定。util。Android Gradle插件2.1的NoTouchElementException   Java中的类型转换运算符百分比计算为零   主java中的调用方法   java在Javasound中播放多个示例   java如何知道webDriver成功打开URL   java jmock,每次调用时返回新对象   eclipse使用Java在Selenium WebDriver中生成可执行文件   macos捆绑Java OS X应用程序默认为MacRoman编码   java我应该把我的休息网关变成一个图书馆吗?   java Eclipse插件:查找包含子字符串的行号无效   Java IOException:在Linux上发送UDP数据包时没有可用的缓冲区空间   java无法解析jaxbxjc2中的名称“xjc:globalJavaType”。2.52.罐子   java是否有HibernateAPI来检查是否创建了数据库?