zoukankan      html  css  js  c++  java
  • Python极其简单的分布式异步作业管理系统RQ入门

    Python极其简单的分布式异步作业管理系统RQ入门

    Python极其简单的分布式异步作业管理系统RQ入门

    1. 什么是Job?

    Job直译过来就是工作,可以是任意的Python函数,你可以把你想要异步执行的任务都写成Job函数。简而言之,Job就是你想执行的操作。例如,我想统计任意网页的字符数量,可以写一个这样的Job函数:

    import requestsdef count_words(url):
        return len(requests.get(url).text.split())

    这样一个函数就可以称之为Job。

    2. 什么是Queue?

    当我有很多Job时,假如我现在有3个Job,分别是j1、j2、j3,那么当计算机要执行这些任务的时候,会按照j1、j2、j3加入的顺序来执行这些Job,这样的一个可以忘里面添加Job,并且能够顺序执行队列称之为Queue。

    例如,我们可以这样来构建一个Queue:

    import redisfrom rq import Queue
    
    
    redis_conn = redis.Redis()
    q = Queue('default', connection=redis_conn)  # 第一个参数是Queue的名称,可以不传,默认为default

    3. 怎么把Job放到队列里面去?

    j = q.enqueue(count_words, args=('https://www.baidu.com',))

    enqueue第一参数是Job函数,args是Job函数的参数,关键字参数可以通过kwargs传入。

    4. 什么是Worker?

    Worker是Job的消费者,简单来说,你把很多Job加入到了Queue,谁来运行这些Job呢?当然就是Worker啦,你也可以看出Worker必须是独立的进程,这个进程从Redis里面获取Job的信息(包括函数、参数等等),然后运行这个Job。

    启动Worker进程也很简单:

    $ rq worker low high default
    16:56:02 RQ worker 'rq:worker:s2.6443' started, version 0.8.1                                            
    16:56:02 Cleaning registries for queue: low         
    16:56:02 Cleaning registries for queue: high        
    16:56:02 Cleaning registries for queue: default     
    16:56:02                                            
    16:56:02 *** Listening on low, high, default...

    后面的三个参数low、high、default,就是这个Worker将要运行哪些Queue里面的Job,这个顺序很重要,排在前面的Queue里面的Job将优先被运行。

    5. 一个完整的例子

    jobs.py

    import requestsimport redisfrom rq import Queuedef count_words(url):
        return len(requests.get(url).text.split())def get_q():
        redis_conn = redis.Redis()    return Queue(connection=redis_conn)

    app.py

    from jobs import get_q, count_wordsdef run():
        q = get_q()
        j = e.enqueue(count_words, 'https://www.baidu.com')
        print(j.result)if __name__ == '__main__':
        run()

    启动Worker:

    $ rq worker

    运行:

    $ python app.py
  • 相关阅读:
    样式表中!important的用法
    ORA27101: shared memory realm does not exist问题的解决
    重置标识列的当前值
    ASP.NET Oracle数据库使用事务时注意事项
    Oracle中约束的添加方法总结
    HTML段落自动换行的样式设置
    ASP.NET应用程序中的服务器错误
    oracle中的rownum、order by与分页
    position:relative与float的区别
    Moss/Sharepoint 备份或还原时出错的处理(持续更新)
  • 原文地址:https://www.cnblogs.com/xiaojikuaipao/p/7402952.html
Copyright © 2011-2022 走看看