pythonrq模块_PythonRQ任务队列中的队列(Queue)

更新时间:2023-06-14 03:32:00 阅读: 评论:0

pythonrq模块_PythonRQ任务队列中的队列(Queue)本来上⼀章节 Python RQ 的运⾏流程 要学习队列和初始化的问题,但是,上⼀章节偏着偏着就将运⾏流程去了
所以,⽆论如何,本章节我们必须将 RQ 中队列学习完
队列初始化
前⼏章节,我们使⽤的都是默认的队列,也就是除了 Redis 连接外,不传递额外参数来创建⼀个队列
q = q = Queue(connection=Redis())
实际上,Queue 可以接受很多参数,第⼀个参数 name ⽤于标识⼀个队列
queue.py
def __init__(lf, name='default', default_timeout=None, connection=None,检察权
is_async=True, job_class=None, **kwargs):
但这个 name 参数除了⽤于识别队列外,其实没啥⼤作⽤
虽然,有时候,我们经常会命名为⼀些看起来很有意思的名字,⽐如 low  、 medium 、high 。 但也仅仅是⽤于标识⼀个队列⽽已
例如我们要创建⼀个 low 的队列,可以使⽤下⾯的⽅法
q = Queue('low', connection=redis_conn)
⼊队
⼀般情况下我们都使⽤下⾯的⽅式将⼀个作业任务加⼊到队列中
该函数的原型为
def enqueue(lf, f, *args, **kwargs)
第⼀个参数⽤于指定作业任务函数,后⾯的 *args 参数⽤于指定⼀些函数调⽤需要⽤到的参数
此外,我们可以添加⼀些选项来作业修改加⼊队列的后的⾏为
默认情况下,这些选项通过 kwargs 这个参数来接收
下表列出了⼀些常见的选项
选项
说明
timeout
⽤于指定作业被中断并标记为失败之前的最⼤运⾏时间。默认单位是秒,可以是整数或表⽰整数的字符串 ( 例如,2,'2') 。此外,还可以是具有指定单位的字符串,包括⼩时,分钟,秒(例如'1h','3m','5s')
result_ttl
⽤于指定作业任务执⾏结果保存的时间
ttl
⽤于指定作业任务在队列中排队的最长时间,超过该时间后,该作业任务就会被取消。如果指定值 -1,则表⽰不限时间,也就是说会⼀直等待,知道该作业任务被执⾏
depends_on
小键盘失灵⽤于指定该作业任务运⾏之前必须完成的另⼀个作业任务( 或作业 ID )
job_id
⽤于⼿动指定该作业任务的 id job_id
at_front
最新资讯⽤于将该作业任务放置在队列的头部,⽽不是尾部,也就是说可以优先被执⾏
kwargs 或 args
使⽤字典或命名参数的⽅式指定上⾯提到的任何参数
针对最后⼀个参数使⽤的情况,使⽤ .enqueue() 的显式版本 .enqueue_call() 是⼀个更好的选择
q = Queue('low', connection=redis_conn)
args=('www.twle',),
timeout=30)
作业⼊队时,针对⽆法访问后台⼯作进程 ( worker ) 中运⾏的源代码的情况( 即代码库 X 从代码库 Y 调⽤延迟函数)我们可以将该函数作为字符串引⽤传递
q = Queue('low', connection=redis_conn)
队列
除了将作业⼊队的⽅法 enqueue() 外,Queues 还有⼀些有⽤的⽅法:
from rq import Queue
from redis import Redis
redis_conn = Redis()
q = Queue(connection=redis_conn)
获取队列中作业任务的长度
print(len(q))
获取⼀个队列中的所有作业任务的 ID
queued_job_ids = q.job_ids
获取所有的作业任务 Job 实例
queued_jobs = q.jobs
获取⼀个 ID 为 my_id 的作业任务
job = q.fetch_job('my_id')
删除队列
中国人民征信中心官网q.delete(delete_jobs=True)
如果传递 delete_jobs=True 则同时会移除队列中的所有作业任务
该⽅法执⾏之后,该队列就不可再使⽤了,不能重新实例化了
背后的设计思维
通过之前的篇幅介绍,想必你也清楚,使⽤ RQ 时,是不需要预先设置任何队列,也不必指定任何通道,交换,路由规则或诸如此类的东西我们可以将⼀个作业任务加⼊到任何想要的队列上
如果将作业任务加⼊到尚不存在的队列,这个队列就会被⽴即创建
RQ 不使⽤任何更加⾼级的中间件来实现路由功能。
你可能会认为这是⼀个很棒的设计,也可能认为是⼀个糟糕的障碍,当然了,取决于你正在解决的问题
最后,RQ 不使⽤任何便携式协议,只依赖于 pickle 来序列化作业任务,但也正因为如此,RQ 仅限于 Python 中使⽤
延迟返回的执⾏结果
当⼀个作业任务被加⼊队列时,queue() 调⽤返回并不是作业任务的执⾏结果,⽽是⼀个 Job 类的实例
当然了,这个类也没有其它⽤途,仅仅是⼀个可⽤于检查实际作业任务结果的代理对象
为此,它有⼀个属性 result ,当作业尚未完成时将返回 None,或者当作业完成时返回⾮ None 值(前提是,假设作业⾸先具有返回值)
# 延时异步执⾏ length_of_url('www.twle/')
job = q.enqueue(task.length_of_url, 'www.twle/')
sult) # => None
# 然后,我们等待个⼏秒,直到作业任务被执⾏完成,就可以查看执⾏的结果
time.sleep(2)
sult) # => 889
望远镜头
@job 装饰器
为了简化将⼀个作业任务加⼊队列的代码,同时也为了兼容 Celery 中的 @task 装饰器
RQ 0.3 加⼊了⼀个新的特性: @job 装饰器,使⽤⽅法也很简单
运动会来稿
from rq.decorators import job
@job('low', connection=my_redis_conn, timeout=5)
def add(x, y):
return x + y
job = add.delay(3, 4)
time.sleep(1)
sult)
当然了,使⽤之前必须从 rq.decorators 模块中导⼊ job 装饰器
绕过⼯作进程 ( worker )
由于某些⽬的,⽐如测试,我们可能更希望将作业任务加⼊队列时就返回其执⾏的结果,⽽不是等待⼯作进程执⾏完成
RQ 0.3.1 新增了这项功能,可以在创建队列时通过传⼊ is_async=Fal 来达到这个⽬的
>>> q = Queue('low', is_async=Fal, connection=my_redis_conn)
>>> job = q.enqueue(fib, 8)
>>> sult
21
这种情况下,任何加⼊ q 队列的作业任务都会⽴刻返回其执⾏结果,⽽不是异步等待 rq worker 的执⾏结果
这种特性,在 Celery 称之为 ALWAYS_EAGER
但请注意,我们仍需要与 Redis 实例建⽴连接,以存储与作业执⾏和完成相关的状态
作业任务相互依赖
RQ 0.4.0 新增加了⼀个功能,就是可以链式执⾏多个作业任务
⼀个作业任务还可以依赖另⼀个作业任务,为了添加这种依赖关系,将作业任务⼊队时可以使⽤ depends_on 来声明依赖关系
q = Queue('low', connection=my_redis_conn)
report_job = q.enqueue(generate_report)
上⾯的代码中,执⾏ nd_report 作业任务前,必须先执⾏ report_job 作业任务
这种作业任务依赖性使得我们可以将⼀个⼤型的作业任务分割成⼏个较⼩的作业任务,依赖另⼀个作业任务的作业任务仅在其依赖关系完成时才会执⾏
⼯作进程 ( worker )
如果想了解更多⼯作进程的信息,可以访问 Worker ⽂档
作业任务的限制因素
从技术上讲,我们可以将任何 Python 函数调⽤放在队列中
但,这并不意味着这样做总是明智的
在将作业任务放⼊队列之前需要考虑的⼀些因素
确保作业任务所在的模块 ( __module__ ) 可以被⼯作进程导⼊
这意味着,⽆法将 __main__ 模块中声明的作业函数加⼊队列
如果使⽤了 __main__ 模块则会报错,详情请参考 Python RQ 的运⾏流程t/38#reply0)
确保⼯作进程 ( worker ) 和作业任务⽣成器共享完全相同的源代码
也就是说,必须调⽤相同的函数实现,不能⽣成作业任务时调⽤的是 a.py 中的 length_of_url() 函数,⽽⼯作进程调⽤的却是另⼀个 a.py 中的 length_of_url() 函数
确保函数调⽤不依赖于其上下⽂,只依赖传递的参数
⾸先要说明的是,全局变量是邪恶的 ( ⼀如既往 ) ,因为谁都可以更改,谁都可以删除
五灵丸
电脑分屏显示⼯作进程在处理作业任务时,函数所依赖的任何状态 ( 例如 「当前」 ⽤户或 「当前 」 Web 请求)都不存在
如果希望为 「当前」⽤户完成⼯作,则应将该⽤户解析为具体实例,并将对该⽤户对象的引⽤作为参数传递给作业
运⾏时限制
RQ 的⼯作进程 rq worker 只能运⾏在实现了 fork() 函数的系统上
也就是说,⼀般⽆法运⾏在 Windows 操作系统上,除⾮安装并使⽤ Windows 下 Linux ⼦系统 且使⽤ bash 作为 shell

本文发布于:2023-06-14 03:32:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1037500.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:作业   任务   队列
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图