比如说,为了验证用户身份的有效性,有些网站在注册新用户的时候,会向用户给定的邮件地址发送一封激活邮件,用户只有在点击了验证邮件里面的激活链接之后,新注册的帐号才能够正常使用。

    下面这段伪代码展示了一个带有邮件验证功能的帐号注册函数,这个函数不仅会为用户输入的用户名和密码创建新帐号,还会向用户给定的邮件地址发送一封激活:

    因为邮件发送操作需要进行复杂的网络信息交换,所以它并不是一个快速的操作,如果我们直接在 函数里面执行邮件发送操作的话,那么用户可能就需要等待一段较长的时间才能看到 ui_print() 函数打印出的反馈信息。

    为了解决这个问题,在执行 send_validate_email() 函数的时候,我们可以不立即执行邮件发送操作,而是将邮件发送任务放入到一个队列里面,然后由后台的线程负责实际执行。这样的话,程序只需要执行一个入队操作,然后就可以直接向用户反馈注册结果了,这比实际地发送邮件之后再向用户反馈结果要快得多。


    代码清单 4-4 使用列表实现的消息队列:/list/message_queue.py


    为了使用这个消息队列,我们通常需要用到两个客户端:

    而以下代码则展示了消息发送者是如何将消息推入到队列里面的:

    本节展示的消息队列之所以使用 BLPOP 命令而不是 命令来实现出队操作,是因为阻塞弹出操作可以让消息接收者在队列为空的时候自动阻塞,而不必手动进行休眠,从而使得消息处理程序的编写变得更为简单直接,并且还可以有效地节约系统资源。

    作为对比,以下代码展示了在使用 LPOP 命令实现出队操作的情况下,如何实现类似上面展示的消息处理程序:

    因为缺少自动的阻塞操作,所以这个程序在没有取得消息的情况下,只能以一百毫秒一次的频率去尝试获取消息,如果队列为空的时间比较长,那么这个程序就会发送很多多余的 LPOP 命令,并因此浪费很多 CPU 资源和网络资源。

    使用消息队列实现实时提醒

    比如说,如果我们在构建一个社交网站的话,那么可以使用 JavaScript 脚本,让客户端以异步的方式调用 MessageQueue 类的 方法,然后程序就可以在用户被关注的时候、收到了新回复的时候又或者收到新私信的时候,通过调用 add_message() 方法来向用户发送提醒信息。