引言

最近在用 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的更多相关文章

  1. [译]Python中的异步IO:一个完整的演练

    原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...

  2. Python中实现异步并发查询数据库

    这周又填了一个以前挖下的坑. 这个博客系统使用Psycopy库实现与PostgreSQL数据库的通信.前期,只是泛泛地了解了一下SQL语言,然后就胡乱拼凑出这么一个简易博客系统. 10月份找到工作以后 ...

  3. Python中任务队列-芹菜celery的使用

    一.关于celery 芹菜celery是一个python实现的异步任务队列,可以用于爬虫.web后台查询.计算等等.通过任务队列,当一个任务来临时不再傻傻等待. 他的架构如下: Broker 我们的生 ...

  4. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  5. Python 中的进程、线程、协程、同步、异步、回调

    进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...

  6. 在Python中使用asyncio进行异步编程

    对于来自JavaScript编码者来说,异步编程不是什么新东西,但对于Python开发者来说,async函数和future(类似JS的promise)可不是那么容易能理解的. Concurrency ...

  7. Python多线程异步任务队列

    原文地址 python的多线程异步常用到queue和threading模块 #!/usr/bin/env python # -*- coding: UTF-8 -*- import logging i ...

  8. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

  9. python中利用redis构建任务队列(queue)

    Python中的使用标准queue模块就可以建立多进程使用的队列,但是使用redis和redis-queue(rq)模块使这一操作更加简单. Part 1. 比如首先我们使用队列来简单的储存数据:我们 ...

随机推荐

  1. 使用SqlConnectionStringBuilder构造数据库连接字符串

    在实际开发过程中,很多时候会拷贝一个现有的数据库连接字符串,修改对应的数据库名.用户名.密码等配置成新的数据库连接字符串.但是有时候我们需要增加一些额外的配置,比如超时时间,最大连接池等,此时我们可以 ...

  2. pytest之mark功能

    pytest系列(一)中给大家介绍了pytest的特性,以及它的编写用例的简单至极. 那么在实际工作当中呢,我们要写的自动化用例会比较多,不会都放在一个py文件里. 如下图所示,我们编写的用例存放在不 ...

  3. 2019 金蝶java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.金蝶等公司offer,岗位是Java后端开发,因为发展原因最终选择去了金蝶,入职一年时间了,也成为了面试官,之 ...

  4. MySQL常用sql语句大全

    创建数据库 1 create database dbname; 删除数据库 1 drop database dbname; 选择数据库 1 use dbname; 创建表 12345678 CREAT ...

  5. python基础--初始数据结构

    目录: 一.知识点1.IDE 集成开发环境2.字符格式化输出3.数据运算4.循环loop5.数据类型6.列表与元组 二.例子1.输入名字.年龄.工作.薪水,进行格式化的输出.2.for语句实现输入密码 ...

  6. Guava入门

    其实我用guava差不多大半年时间了,发现guava真的特别好用,又会使代码变得很简洁,最近又系统的学习了一下,大致讲一下

  7. Ext.bind函数说明

    bind( fn, [scope], [args], [appendArgs] ) : FunctionCreate a new function from the provided fn, chan ...

  8. linux ssh scp免密码

    1.首先登入一台linux服务器做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成key文件:ssh-keygen -t rsa 2.在母机上,进入/root/.ssh目录,找到id ...

  9. git 检索

    图形化客户端:sourcetree下载: https://www.sourcetreeapp.com/安装: 由于种种不可描述的原因,无法注册账号且无法登陆所以需要绕过登陆绕过登陆: 去到 C:\Us ...

  10. Protobuf协议应用干货

    Protobuf应用广泛,尤其作为网络通讯协议最为普遍.本文将详细描述几个让人眼前一亮的protobuf协议设计,对准备应用或已经应用protobuf的开发者会有所启发,甚至可以直接拿过去用. 这里描 ...