python成长之路【第十二篇】:RabbitMQ入门

一、RabbitMQ介绍

解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议。 AMQP协议是一种基于网络的消息传输协议,它能够在应用或组织之间提供可靠的消息传输。RabbitMQ是该AMQP协议的一种实现,利用它,可以将消息安全可靠的从发 送方传输到接收方。简单的说,就是消息发送方利用RabbitMQ将信息安全的传递给接收方。

RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

二、RabbitMQ安装

yum -y install epel-release
yum -y install rabbitmq-server

systemctl start rabbitmq-server.service #启动服务
systemctl enable rabbitmq-server.service #将服务加入开机启动

安装API,使用API操作RabbitMQ
  pip install pika
  or
  easy_install pika
  or
  源码https://pypi.python.org/pypi/pika

三、一个简单的RabbitMQ示例

# ######################### 发布者 #########################
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(‘192.168.31.11‘))
channel = connection.channel()

# 声明一个queue
channel.queue_declare(queue=‘hello_chen‘)

#n RabbitMQ a message can never be sent directly to the queue, it always needs to go through an exchange.
# exchange类似一个交换机,然后由交换机决定将消息放入那个队列中。这里为空表示交换机不工作。
# 将body中的数据放入名为hello_chen的队列中。
channel.basic_publish(exchange=‘‘,
                      routing_key=‘hello_chen‘,
                      body=‘Hello World!‘)
print(" [x] Sent ‘Hello World!‘ ")
connection.close()

发布者

# ########################## 订阅者 ##########################
import pika
import time

connection = pika.BlockingConnection(pika.ConnectionParameters(‘192.168.31.11‘))
channel = connection.channel()

#You may ask why we declare the queue again ? we have already declared it in our previous code.
# We could avoid that if we were sure that the queue already exists. For example if send.py program
#was run before. But we‘re not yet sure which program to run first. In such cases it‘s a good
# practice to repeat declaring the queue in both programs.
# 为什么消费者程序中还需要创建一个队列,是因为不知道生产者和消费者谁先启动。否则会报错。
channel.queue_declare(queue=‘hello_chen‘)

def callback(ch, method, properties, body):
    print(‘-->‘, ch, method, properties)
    time.sleep(10)  # 模拟任务需要10S
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)  # 队列消息处理完后发送ack,需要和下面的no_ack一起使用

# 将队列hello_chen中body里面的数据取出去,然后当做参数赋值给callback函数中的body。
channel.basic_consume(callback,
                      queue=‘hello_chen‘
                      # no_ack=True  #此参数虽然可以增加消息的ack,但对效率会有影响
                      )

print(‘ [*] Waiting for messages. To exit press CTRL+C ‘)
channel.start_consuming()

订阅者

时间: 2024-10-11 04:41:37

python成长之路【第十二篇】:RabbitMQ入门的相关文章

python成长之路【第五篇】:python字符编码

在2.7环境中我们要写上这一行#-*- coding:utf-8 -*- 为什么我们要加这一行呢?这一样的意思是置顶编码类型为utf-8编码! 首先在看这个问题之前,咱们是否曾想过一个问题? 为什么我们可以在显示器上能看到这些文字.数字.图片.字符.等等信息呢?大家都知道计算机本身只能识别 0 1 的组合,他们是怎么展示这些内容的呢?我们怎么和计算机去沟通呢? 如果我们使用0 1 的组合和计算机沟通你还能看到这些内容吗?还有一个问题就是01的组合对于咱们说几乎看不懂对吧! 那怎么办?如何让计算机

cocos2dx学习之路----第十二篇(关于Node节点的自我更新函数Update探讨及定时器的使用)

这一篇来谈谈关于Node节点比较重要的函数接口,自我更新接口(update)以及定时器. 好,下面先来谈谈节点的自我更新. 每一个Node节点都有自带一个update函数.而当调用ScheduleUpdate()这一方法便会被开启,在每一帧被调用. 我们可能注意到,在AppDelegate中有个setAnimationInterval()的方法,有导演类调用.而这个方法就是设置渲染的帧率的.默认是以60帧每秒进行渲染.当然,并不是真正的每秒就渲染60次,这个只能是差不多达到这个速率,因为程序在运

Python成长之路【第五篇】:Python基础之文件处理

一.文件操作 1.介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统.操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来. 有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件

Python成长之路【第五篇】:Python基础之迭代器和生成器

一.递归和迭代 递归就是调用自身 迭代就是每次迭代都是依赖于上次结果 二.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for循环,sum,min,max等函数)都是使用迭代器协议访问对象 三

python学习之路(十二)

这节主要介绍一下import!很实用的调用模块的功能. 导入模块 是导入真实的代码 而导入包 是导入包下面的 __init__() 文件 这两个是不一样的 先说模块定义 模块 它就是一个 py 文件 它就是负责从逻辑上 组织代码的 代码里面 它可以有变量 有函数 有类 有逻辑 模块 它不是这些东西的简单堆砌 而是要实现功能 创建模块 就是 new 一个 python file 定义一个模块: 在另一个文件中 要使用这个模块 所以要这样来调用: 模块名 点 变量名 模块名 点 方法名 import

python成长之路【第十三篇】:Python操作MySQL之pymysql

对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行SQL #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 创建连接 conn = pymysql.connect(host='127.0.0.1',

python成长之路【第三篇】:函数

1.函数基础 函数是python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构. 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件. 函数用于将相关功能打包并参数. python中可以创建4种函数: 全局函数:定义在模块中 局部函数:嵌套于其他函数中 lambda函数:表达式 方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用 Python提供了很多内置函数. 注意:有两种方式可以查看Python的内置函数. 1.https://docs.python.or

Python成长之路【第五篇】:Python基础之装饰器

一.什么是装饰器 装饰:装饰既修饰,意指为其他函数添加新功能 器:器既函数 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器需要遵循的原则 1.不能修改装饰器的源代码(开放封闭原则) 2.为装饰器函数添加新功能后,不能修改函数的调用方式 三.实现装饰器的知识储备 装饰器 = 高阶函数 + 函数嵌套 + 闭包 四.高阶函数 高阶函数的定义: 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个,都可以称为之高阶函数 1 def foo(): 2 p

Python成长之路【第五篇】:Python基础之模块

模块&包 模块(module)的概念: 在计算机程序开发的过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放在不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的存在.在Python中,一个.py文件就称之为一个模块(module) 使用模块有什么好处? 最大的好处是大大提高了代码的可维护性. 其次,编写代码不必从零开始,当一个模块编写完毕,就可以被其他地方利用,我们在编写程序的时候,也经常

Python高手之路【十二】面向对象设计模式

单例模式 单例,顾名思义单个实例. class Person: __instance = None def __init__(self): pass @staticmethod def getInstance(): if Person.__instance: return Person.__instance else: Person.__instance = Person() return Person.__instance obj1 = Person.getInstance() print(o