使用过celery的同学,是不是觉得很繁琐,用起来很麻烦?本篇文章来简单给大家介绍另外一款异步任务框架dramatiq
有多年celery使用经验的罗马尼亚工程师Bogdan Popa觉得celery就是个大烂坑,于是发明了dramatiq
dramatiq的驱动原则是如下:
高可靠性和高性能,简单易懂的核心,约定由于配置
下面是dramatiq,celery,RQ之间的主要区别:
下面来介绍一下安装方式:
如果安装有RabitMQ作为消息broker,安装方式: pip install -U 'dramatiq[rabbitmq, watch]'
如果安装有redis作为消息broker,安装方式: pip install -U 'dramatiq[redis, watch]'
RabitMQ是推荐的消息broker,也是默认的,可以在代码中设置redis为broker
也可以用这种方式安装 pip install -U 'dramatiq[all]'
要配置RabbitMQ主机,实例化RabbitmqBroker,并在程序执行期间尽可能早地将其设置为global broker:
import dramatiq
from dramatiq.brokers.rabbitmq import RabbitmqBroker
rabbitmq_broker = RabbitmqBroker(host="rabbitmq")
dramatiq.set_broker(rabbitmq_broker)
要配置redis为broker:
import dramatiq
from dramatiq.brokers.redis import RedisBroker
redis_broker = RedisBroker(host="redis", port=6379)
dramatiq.set_broker(redis_broker)
演示代码,host,port根据具体情况配置
下面来简单介绍下dramatiq的使用。
dramatiq/demo1.py
import requests
import dramatiq
# print(dramatiq.get_broker())
@dramatiq.actor
def count_words(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
}
try:
response = requests.get(url, headers=headers)
count = len(response.text.split(" "))
print("*" * 50)
print("There are {count} words at {url}.".format(count=count, url=url))
print("haha")
print("*" * 50)
except requests.exceptions.MissingSchema:
print("Message dropped due to invalid url: {}".format(url))
进入该文件所在目录,打开终端,进入python交互模式,输入 dramatiq demo1
再打开一个终端,进入python交互模式,
输入 from demo1 import count_words
输入 urls = ["https://news.ycombinator.com","https://xkcd.com","https://rabbitmq.com"]
再输入 [count_words.send(url) for url in urls]
显示结果如图
有一个注意事项是:因为所有的消息都必须通过网络发送,所以发送给actor的任何参数都必须是能被json编码的。
如果在第二个终端输入 : count_words.send("foo")
本篇文章先简单介绍到这里,后续再更新更多用法和特性
官方文档地址: https://dramatiq.io/v1.3.0/index.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |