这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
前言: 首先你需要安装RabbitMQ在您的本地,端口设置为5672. 如果使用不同的主机端口则配置需要调整. 在第一个教程中,我们编写了从指定队列发送和接收消息的程序。在此中,我们将创建一个工作队列,用于在多个员工之间分配耗时的任务。
发送消息,并循环消费
在第一个教程中,我们编写了从指定队列发送和接收消息的程序。在此中,我们将创建一个工作队列,用于在多个员工之间分配耗时的任务。
工作队列(又名任务队列)背后的主要理念是避免立即执行资源密集型任务,并必须等待任务完成。相反,我们安排任务在以后完成。我们将任务封装为消息并将其发送到队列。在后台运行的工人过程将弹出任务并最终执行作业。当您运行许多员工时,任务将在他们之间共享。
此概念在网络应用程序中特别有用,在短的 HTTP 请求窗口期间无法处理复杂的任务。
1. 从命令行发送消息
我们将稍微修改我们以前示例中的send.py代码,以便从命令行发送任意消息。此程序将安排任务到我们的工作队列,因此让我们将其命名为new_task.py:
import sys
message = ' '.join(sys.argv[1:]) or "Hello World!"
channel.basic_publish(exchange='',
routing_key='hello',
body=message)
print(" [x] Sent %r" % message)
2. 从队列执行任务
我们的旧receive.py脚本还需要一些更改:从队列执行任务,因此让我们称之为worker.py:
import time
def callback(ch, method, properties, body):
print(" [x] Received %r" % body.decode())
time.sleep(body.count(b'.'))
print(" [x] Done")
3.循环调度
使用任务队列可以帮助外面更轻松的执行工作,并且可以将任务积累到队列中,通过增加发送者来达到。
首先,让我们尝试同时运行两个worker.py脚本。他们都会从队列中收到消息。
您需要打开三个控制台。两个将运行worker.py脚本。这些控制台将是我们的两个消费者 - C1和C2。
# shell 1
python worker.py
# => [*] Waiting for messages. To exit press CTRL+C
# shell 2
python worker.py
# => [*] Waiting for messages. To exit press CTRL+C
C1和C2将循环消费队列中的消息,直到队列中的消息被消费完。