- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简短版本:如何防止在远程过程调用情况下阻塞 Pika?
长版:
没有一个 Pika 示例展示了我的用例。
我有一个 Tornado 服务器,它通过 AMQP(RabbitMQ、Pika)与其他进程/机器通信。这些其他进程的定义不是很明确,但在大多数情况下,它们将返回数据(请参阅 RPC example on RabbitMQ's website )。有时,一个进程可能需要花费极长的时间来处理大量信息,但它不应该完全阻止进程处理较小的请求。或者,远程服务器可能因为发出 Web 请求而阻塞。可以将其视为 Web 服务器,但使用 AMQP 而不是 HTTP。
由于 Pika 文档声称它不是线程安全的,因此我无法将连接传递给多个线程(或进程,就此而言)。我想要做的是启动一个新进程,并向 Pika IOLoop 添加一个套接字事件(用于该程序的管道),就像我可以用 Tornado 做的那样。 Pika IOLoop 与 Tornado IOLoop 有很大不同,它似乎不支持添加多个处理程序;它似乎在一个套接字上使用一个“轮询器”进行操作。
我想避免为这个包要求 Tornado 包,因为我只会使用 IOLoop。这不是不可能的,但我想看看我的其他选择是什么,或者是否可以通过某种方式连接多个 Pika IOLoops/Pollers 来解决我的问题。 RabbitMQ 的文档说,worker 通常可以通过添加更多来“扩展”。我想避免为每个传入的请求创建连接(如果它们传入速度很快)。
最佳答案
根据您的描述,我相信您很遗憾要么需要不同的通信模型,要么需要多个 Pika IOLoops/Pollers/Redundant Connections。
从文档和其他站点听起来,Pika 中的 RPC 始终是一个阻塞语句,无法在线程之间传递。参见 http://www.rabbitmq.com/tutorials/tutorial-six-python.html作者指出,一旦您实际调用 ioloop,Pika 中的 RPC 本质上是阻塞的。
"When in doubt avoid RPC. If you can, you should use an asynchronous pipeline - instead of RPC-like blocking"
如果您想在一个连接完成之前继续在同一个连接上发送多个 RPC 调用,您将需要一个不同的异步模型。在完成之前在同一个连接上进行多次 RPC 调用并不是 RPC 模型的通常实现,尽管这在技术上并不被禁止(http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.progcomm%2Fdoc%2Fprogcomc%2Frpc_mod.htm)。我不认为 Pika 使用此模型运行,尽管它确实通过回调提供了异步支持(我认为这不是您正在寻找的)。
如果您只是想轻松地动态生成新连接,您可以在连接上使用线程或进程包装器,在其他上下文中创建和阻止 RPC,然后推送到公共(public)队列主线程可以监听。 Tornado 可能会给你这个,但我同意这有点矫枉过正,制作这样一个连接包装器应该不会那么困难,因为我已经用不到 100 行 Python 为其他 I/O 操作做了类似的事情(请参阅线程包装器版本的队列包)。我认为您已经根据您对多个 IOLoop 的讨论看到了这种可能性。
关于python - 我如何在长期工作的消费者中提供与 Pika 的并发性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023071/
我希望我的队列丢弃在特定时间内未处理的消息。 我已经通过记录发布时间在消费者中做到了这一点。然而,在没有人订阅的情况下,队列最好简单地丢弃陈旧的消息。 我可以在 Pika 的消息中设置过期时间 (TT
当使用 pika 关闭与 RabbitMQ 服务器的连接时,警告 WARNING:pika.adapters.base_connection:Unknown state on disconnect:
我有一个代码,它只是用 pika 将消息排队到代理的队列中。 class Publisher: def __init__(self, config): self._params
我在官方文档和源代码中搜索过它,但没有意义。 我也尝试将其设置为10或1等值,但在rabbitmq管理的Web控制台中仍然显示heartbeat=60。 最佳答案 来自 RabbitMQ 文档: Th
我在官方文档和源代码中搜索过它,但没有意义。 我也尝试将其设置为10或1等值,但在rabbitmq管理的Web控制台中仍然显示heartbeat=60。 最佳答案 来自 RabbitMQ 文档: Th
我在测试pika的时候看到了这个异常 当我只使用默认值时它有效。但是,当我在连接参数中添加凭据时,它引发了异常。 import pika credentials = pika.PlainCredent
我有一个问题。我的鼠兔客户端永久崩溃并显示错误消息。 这就是发生的事情: RabbitMQ 正在运行,生产者已将消息推送到队列中 我启动 python 脚本,它会处理队列中缓冲的所有包 我的脚本定期抛
我正在开发一个带有后台线程的 Python 应用程序,用于使用来自 RabbitMQ 队列的消息(主题场景)。 我在按钮的 on_click 事件上启动线程。这是我的代码,请注意“#self.rece
我们的软件程序正常运行了 5 个月,现在突然间我们开始收到 Pika 警告,最终导致异常。 Pika 0.9.5 UserWarning:写入缓冲区超出警告阈值。 我搜索了很多论坛,但都不太满意。所描
我想定期运行一个进程(比如每 10 分钟一次,或每小时一次)从队列中获取所有消息,处理它们然后退出。有什么方法可以用 pika 做到这一点,还是我应该使用不同的 python 库? 最佳答案 我认为这
我一直在试图弄清楚在使用 pika 时应该使用哪种连接形式,据我所知,我有两种选择。 BlockingConnection 或 SelectConnection,但我不太确定这两者之间的区别(即 Bl
rabbitmq中文翻译的话,主要还是mq字母上:Message Queue,即消息队列的意思。前面还有个rabbit单词,就是兔子的意思,和python语言叫python一样,老外还是蛮幽默的。r
我正在使用鼠兔的 twisted protocol adapter .成功处理消息后,我使用此调用向 RabbitMQ 发送确认: channel.basic_ack(delivery_tag=del
使用 pika 客户端,我想显示当前队列中的所有消息,而不使用它们。只是为了知道队列有多忙并显示作业。 到目前为止,我只能在收到一条消息时阅读它: channel.queue_declare(queu
有 Pika 经验的人能否就以下功能是否可行,或者我的想法是否表明对 Pika 缺乏概念性理解,快速回答是/否。 我想要的功能: Python 服务(单线程脚本)使用 SelectConnection
从我的生产者代码中,我想知道消费者何时basic.ack发送了消息。 使用channel.confirm_delivery()和BlockingConnection,从文档中不清楚这是否应该确认1)代
我有一个运行python脚本的docker容器。该脚本提供了一个AMQP网址,Pika用作pika.BlockingConnection的URLParameters。当我在计算机上运行脚本时,它运行良
我尝试在我的 exchange_declare 回调中使用交易所名称。我将 SelectConnection 适配器用于 Pika 中的异步请求。 我的想法是首先在我的程序中构建交换器、队列和绑定(b
简短版本:如何防止在远程过程调用情况下阻塞 Pika? 长版: 没有一个 Pika 示例展示了我的用例。 我有一个 Tornado 服务器,它通过 AMQP(RabbitMQ、Pika)与其他进程/机
如何使用 Pika 库在 RabbitMQ 消费者中添加超时,以便队列中的每条新消息都等待消费者处理一段时间?我正在使用阻塞连接 最佳答案 使用 docs 中提到的 add_timeout 回调 关于
我是一名优秀的程序员,十分优秀!