消息服务器rabbmit

RabbitMQ 消息队列

python里有两个Q, threading queue、不同线程间数据交互

进程Queue: 不同进程间交互这个说法是错误的。 这个是用于父进程与子进程间交互、或者同属于同一父进程下多个子进程进行交互。

两个python程序的进程间是无法通信的。

各个独立进程间通信:

QQ 要发送消息给 world。1、通过socket,这个需要自己去写很多东西(沾包、收到的是什么需要返回的又是什么……) 。2、消息队列,

那两个不同的程序要通信、两台机器要通信?

消息队列: 可以跟各种进程通信、且不用再去写什么沾包啊之类的

zeromq\activemq 这些都是消息队列

很多事件需要自己去体验一下。

Rabbitmq:  erlang开发的

发消息:轮询

消息发出去了、需要确认吗? 还是发出去就完了,管你的。

大部份情况都需要回发一下处理完的消息。。万一处理过程中、挂了怎么办?发送端没收到回复是吧

挂了,socket断了,发送端自然知道、这消息立马就重新发给另一个在线的接收端。

no_ack=False# 需要收到了回应才放弃这条消息

回应保证的是:客户端、接收消息端挂掉   channel.basic_ack()

持久化: 保证的是,服务器挂掉之后

Rabbitmq安装:

需要安装好环境:erlang

brew install rabbitmq

看例子:

import time
import pika
import uuid class MyRabbmit(object):
def __init__(self):
self.connection = pika.BlockingConnection(pika.ConnectionParameters(
"localhost"
))
self.channel = self.connection.channel()
# self.channel.queue_declare(queue="rpc_queue")
result = self.channel.queue_declare(exclusive=True)
self.callback_queue = result.method.queue self.channel.basic_consume(self.on_response,
queue=self.callback_queue,
# no_ack=True
) def on_response(self, ch, method, property, body):
print(property.reply_to)
print(body) self.response = body.decode() def call(self, cmd):
self.response = None
self.uuid = str(uuid.uuid4())
print(self.uuid)
self.channel.basic_publish(exchange="",
routing_key="rpc_queue",
body = cmd,
properties = pika.BasicProperties(
reply_to=self.callback_queue,
correlation_id=self.uuid
)
)
while self.response is None:
time.sleep(0.5)
self.connection.process_data_events()
# print("wait...")
return self.response my_rpc = MyRabbmit()
cmd = input(">>").strip()
if cmd:
result = my_rpc.call(cmd) print("result: ", result)
import os
import pika connection = pika.BlockingConnection(pika.ConnectionParameters(
"localhost"
)) channel = connection.channel()
channel.queue_declare("rpc_queue") def func(cmd):
result = os.popen(cmd).read()
print(result)
return result def on_response(ch, method, property, body):
print(body)
print(property.reply_to, property.correlation_id)
body = func(body.decode())
channel.basic_publish(exchange="",
routing_key=property.reply_to,
body=body
)
ch.basic_ack(delivery_tag=method.delivery_tag) # 回复一下结果 channel.basic_consume(on_response,
queue="rpc_queue",
no_ack=False,
) print("等待收消息...")
channel.start_consuming()

Python 第五阶段 学习记录之----rabbmit的更多相关文章

  1. Python 第五阶段 学习记录之---Django 进阶

    Model 一.创建表 1.基本结构 字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  2. Python 第五阶段 学习记录之---Django 基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  3. Python 第五阶段 学习记录之--- Web框架

    什么是web服务器的原理是什么 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env pyt ...

  4. Python 第五阶段 学习记录之----ORM

    ORM: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了 ...

  5. Python 第八阶段 学习记录之---算法

    算法(Algorithm): 一个计算过程, 解决问题的方法 1.递归的两个特点 - 调用自身 - 结束条件 时间复杂度 - 时间复杂度是用来估计算法运行时间的一个式子(单位) - 一般来说,时间复杂 ...

  6. python 第四阶段 学习记录之----异步

    异步: 知识情况: 1.多线程, 多线程使用场景 1.IO操作不占CPU,读写数据(网络中.系统中) 2.计算占CPU, 3.上下文切换不占CPU.它消耗资源 python多线程 不适合CPU密集型的 ...

  7. Python 第四阶段 学习记录之----多线程

    多线程 多线程例子, 注释部份即为多线程的使用 #-*- coding: utf-8 -*- # Wind clear raise # 2017/3/5 下午2:34 import socket im ...

  8. python+selenium 自动化测试框架-学习记录

     本人小白一枚,想着把学习时的东西以博客的方式记录下来,文章中有不正确的地方请大佬多多指点!!共同学习 前期准备 安装python3.selenium.下载对应版本的webdriver:安装所需的第三 ...

  9. python pep8编码风格学习记录(转)

    简要归纳 每个缩进层级使用4个空格. 每行最多79个字符. 顶层的函数或类的定义之间空两行. 采用ASCII或UTF-8编码文件 在文件顶端,注释和文档说明之下,每行每条import语句只导入一个模块 ...

随机推荐

  1. Springboot多数据源配置--数据源动态切换

    在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...

  2. Centos 下 JProfiler 9.1.1 安装 部署 及 使用

    JProfiler[1] 是一个商业授权的Java剖析工具,由EJ技术有限公司,针对的Java EE和Java SE应用程序开发的.它把CPU.执行绪和内存的剖析组合在一个强大的应用中.JProfil ...

  3. Zephyr学习(二)开发环境搭建

    一.概述 Zephyr支持在Windows.Linux和MacOS环境下开发,这里只介绍如何在Windows下搭建zephyr的开发环境. 二.步骤 2.1安装msys2 msys2是一个Linux模 ...

  4. xcode8 iOS函数返回值使用警告

    没有使用返回值时, 警告 swift: @warn_unused_result func doSomething() -> Bool { return true } OC: - (BOOL)do ...

  5. 11.17 flask (1)

    2018-11-17 18:38:42 开始学习进行玩前面项目  开始进军flask flask是一个小型的web框架,,但是有很多第三方组件 最后组装组装就和django一样啦!!!!!!! pyt ...

  6. 11.8Django中的组件content_type

    2018-11-8 18:59:11 在Django中已经有一个contenttype这个组件,并且在python manage.py makemigrations 和migrate的时候,一起在数据 ...

  7. A - Black Box 优先队列

    来源poj1442 Our Black Box represents a primitive database. It can save an integer array and has a spec ...

  8. Educational Codeforces Round 1

    598A - Tricky Sum    20171103$$ans=\frac{n(n+1)}{2} - 2\sum_{k=0}^{\left \lfloor \log_2 n \right \rf ...

  9. javascript的数组之find()

    find()方法返回数组中第一个满足回调函数测试的第一个元素的值.否则返回undefined const arr1 = [1, 2, 3, 4, 6, 9]; let found = arr1.fin ...

  10. JVM内存布局

    1. 概述 对于从事c和c++程序开发的开发人员来说,在内存管理领域,他们既拥有最高权力的”皇帝“又是从事最基础工作的”劳动人民“---既拥有每个对象的”所有权“,又担负着每个对象开始到终结的维护责任 ...