Python中的异步任务队列 arq
引言
最近在用 sanic 写东西,所有涉及到IO阻塞的代码都需要用 aio 的模块,好在近年来 asyncio 生态圈发展的还算不错,该有的都有 ~
近期业务中 登录/注册 业务涉及的很复杂(涉及到邀请),需要解锁、发送短信等操作,想来这么个模块整的很繁琐,以后加个滑动验证那还了得。
于是乎,想整一个类似于celery 的模块,进行任务解耦,但是目前 celery 还目前不支持异步(官方将在 celery5 支持异步)。
所以目前查阅资料发现了一个 python 实现的 arq 模块,已经应用在了生产环境,效果还算不错 ~
官方是这么介绍它的:
- 非阻塞
- 延迟执行、定时任务、重试机制
- 快
- 优雅
- 小
首先先安装一下它:
$ pip install arq
那么接下来,快速了解下它的使用吧 ~
简单使用
先看下面编写的这段代码
# filename: tasks.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2019/5/23
import asyncio
from arq import create_pool
from arq.connections import RedisSettings
async def say_hello(ctx, name) -> None:
"""任务函数
Parameters
----------
ctx: dict
工作者上下文
name: string
Returns
-------
dict
"""
print(ctx)
print(f"Hello {name}")
async def startup(ctx):
print("starting...")
async def shutdown(ctx):
print("ending...")
async def main():
# 创建
redis = await create_pool(RedisSettings(password="root123456"))
# 分配任务
await redis.enqueue_job('say_hello', name="liuzhichao")
# WorkerSettings定义了创建工作时要使用的设置,
# 它被arq cli使用
class WorkerSettings:
# 队列使用 `redis` 配置, 可以配置相关参数
# 例如我的密码是 `rooot123456`
redis_settings = RedisSettings(password="root123456")
# 被监听的函数
functions = [say_hello]
# 开启 `worker` 运行
on_startup = startup
# 终止 `worker` 后运行
on_shutdown = shutdown
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
1、接下来看我们怎么运行它
$ arq tasks.WorkerSettings
Maybe you can see
10:56:25: Starting worker for 1 functions: say_hello
10:56:25: redis_version=4.0.1 mem_usage=32.00M clients_connected=6 db_keys=19189
starting...
2、运行 tasks.py 文件
$ python3 tasks.py
Maybe you can see
11:01:04: 0.29s → 5a5ac0edd5ad4b318b9848637b1ae800:say_hello(name='liuzhichao')
{'redis': <ArqRedis <ConnectionsPool [db:0, size:[1:10], free:1]>>, 'job_id': '5a5ac0edd5ad4b318b9848637b1ae800', 'job_try': 1, 'enqueue_time': datetime.datetime(2019, 5, 23, 3, 1, 4, 570000), 'score': 1558580464570}
Hello liuzhichao
11:01:04: 0.00s ← 5a5ac0edd5ad4b318b9848637b1ae800:say_hello ●
3、那么这个简单任务就执行完成了,是不是特别简单 ~
定时任务
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2019/5/23
from arq import cron
from arq.connections import RedisSettings
async def run_regularly(ctx):
# 表示在 10、11、12 分 50秒的时候打印
print('run job at 26:05, 27:05 and 28:05')
class WorkerSettings:
redis_settings = RedisSettings(password="root123456")
cron_jobs = [
cron(run_regularly, minute={10, 11, 12}, second=50)
]
1、运行它
$ arq tasks.WorkerSettings
If run out of the time,maybe you can see
11:10:25: Starting worker for 1 functions: cron:run_regularly
11:10:25: redis_version=4.0.1 mem_usage=32.00M clients_connected=6 db_keys=19190
11:10:51: 0.51s → cron:run_regularly()
run foo job at 26:05, 27:05 and 28:05
11:10:51: 0.00s ← cron:run_regularly ●
11:11:51: 0.51s → cron:run_regularly()
run foo job at 26:05, 27:05 and 28:05
11:11:51: 0.00s ← cron:run_regularly ●
11:12:50: 0.50s → cron:run_regularly()
run foo job at 26:05, 27:05 and 28:05
11:12:50: 0.00s ← cron:run_regularly ●
按照此时间线,然后会一直进行无限循环下去
更多
更多api学习请查看官方文档 --> https://arq-docs.helpmanual.io
Python中的异步任务队列 arq的更多相关文章
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...
- Python中实现异步并发查询数据库
这周又填了一个以前挖下的坑. 这个博客系统使用Psycopy库实现与PostgreSQL数据库的通信.前期,只是泛泛地了解了一下SQL语言,然后就胡乱拼凑出这么一个简易博客系统. 10月份找到工作以后 ...
- Python中任务队列-芹菜celery的使用
一.关于celery 芹菜celery是一个python实现的异步任务队列,可以用于爬虫.web后台查询.计算等等.通过任务队列,当一个任务来临时不再傻傻等待. 他的架构如下: Broker 我们的生 ...
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
- 在Python中使用asyncio进行异步编程
对于来自JavaScript编码者来说,异步编程不是什么新东西,但对于Python开发者来说,async函数和future(类似JS的promise)可不是那么容易能理解的. Concurrency ...
- Python多线程异步任务队列
原文地址 python的多线程异步常用到queue和threading模块 #!/usr/bin/env python # -*- coding: UTF-8 -*- import logging i ...
- Python中异步协程的使用方法介绍
1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...
- python中利用redis构建任务队列(queue)
Python中的使用标准queue模块就可以建立多进程使用的队列,但是使用redis和redis-queue(rq)模块使这一操作更加简单. Part 1. 比如首先我们使用队列来简单的储存数据:我们 ...
随机推荐
- Smack Extensions用户手册
Smack Extensions用户手册 XMPP协议包括基本协议和许多可选扩展,通常记录为“XEP”.Smack为核心XMPP协议提供了org.jivesoftware.smack包,为许多协议扩展 ...
- Options of the DB storage of prometheus
参考: // Options of the DB storage. type Options struct { // The timestamp range of head blocks after ...
- java实现SAP BO登录
最近一个项目用到了SAP的businessObjects,需要进行二次开发,今天开发了登录接口,遇到了一些问题,进行了解决,现在分享一下. 1.依赖jar包的添加 bo登录需要用到一些jar包,具体在 ...
- 米尔科技MPSoC开发板评测
米尔科技推出的MYD-CZU3EG开发板搭载的就是UltraScale+ MPSoC平台器件 — XCZU3EG,它集成了四核Cortex-A53 处理器,双核 Cortex-R5 实时处理单元以及M ...
- Java 面向对象—杂项(方法不能重写,修饰符,变量)
一.哪些方法不能被重写? 1.final 修饰的不能重写 2.static 修饰的不能重写 3.private 修饰的,因为私有的在子类中不可见 4.如果跨包的话,修饰符缺省的也不能被重写,因为缺省的 ...
- android studio打印
写入打印语句 System.out.println("hello furong"); 添加打印过滤 指定过滤规则 Filter Name:随便写 Log Tag:日志标志 Log ...
- Ubuntu下的log日志查看器
1.lnav:Linux 下一个基于控制台的高级日志文件查看器 https://www.cnblogs.com/michealLang/p/9761886.html http://www.imooc. ...
- 3 Dalvik基础知识
Dalvik汇编基础知识: Dalvik指令:由位描述+指令格式标示 位描述: 1. 每16位空格隔开 2. 每个字母表示4位,每个字母按从高字节开始,排列到低字节.每四位之间可用 | 分开表示不同内 ...
- Nginx学习(一)
Nginx I/O模型 网络I/O 本质是socket读取 第一步:将数据从磁盘文件先加载至内核内存空间(暖冲区),等待数据准备完成,时间较长. 第二部:将数据从内核缓冲区复制到用户空间的进程的内存中 ...
- H3C FAT AP