Sau Pika timed received example, tôi muốn có một khách hàng xử lý nhiều yêu cầu đồng thời hơn. Câu hỏi của tôi là, nếu handle_delivery có thể bằng cách nào đó được gọi là mỗi khi nhận được tin nhắn mới và không chờ trả lại handle_delivery trước đó?Xử lý tin nhắn không đồng bộ của khách hàng Pika RabbitMQ
5
A
Trả lời
2
Dường như cuộc gọi tới handle_delivery
đang chặn nhưng bạn có thể thêm trình xử lý phụ vào vòng lặp sự kiện I/O bằng cách sử dụng add_timeout
. Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm để làm:
"""
Asyncronous amqp consumer; do our processing via an ioloop timeout
"""
import sys
import time
from pika.adapters import SelectConnection
from pika.connection import ConnectionParameters
connection = None
channel = None
def on_connected(connection):
print "timed_receive: Connected to RabbitMQ"
connection.channel(on_channel_open)
def on_channel_open(channel_):
global channel
channel = channel_
print "timed_receive: Received our Channel"
channel.queue_declare(queue="test", durable=True,
exclusive=False, auto_delete=False,
callback=on_queue_declared)
class TimingHandler(object):
count = 0
last_count = 0
def __init__(self, delay=0):
self.start_time = time.time()
self.delay = delay
def handle_delivery(self, channel, method, header, body):
connection.add_timeout(self.delay, self)
def __call__(self):
self.count += 1
if not self.count % 1000:
now = time.time()
duration = now - self.start_time
sent = self.count - self.last_count
rate = sent/duration
self.last_count = self.count
self.start_time = now
print "timed_receive: %i Messages Received, %.4f per second" %\
(self.count, rate)
def on_queue_declared(frame):
print "timed_receive: Queue Declared"
channel.basic_consume(TimingHandler().handle_delivery, queue='test', no_ack=True)
if __name__ == '__main__':
# Connect to RabbitMQ
host = (len(sys.argv) > 1) and sys.argv[1] or '127.0.0.1'
connection = SelectConnection(ConnectionParameters(host),
on_connected)
# Loop until CTRL-C
try:
# Start our blocking loop
connection.ioloop.start()
except KeyboardInterrupt:
# Close the connection
connection.close()
# Loop until the connection is closed
connection.ioloop.start()
Các vấn đề liên quan
- 1. Xử lý tin nhắn Clojure/không đồng bộ, đa luồng
- 2. Tin nhắn bị trễ trong RabbitMQ
- 3. Cách rút lại tin nhắn trong RabbitMQ?
- 4. RabbitMQ Đợi tin nhắn hết thời gian
- 5. Rabbitmq truy xuất nhiều tin nhắn bằng cách sử dụng một cuộc gọi đồng bộ đơn
- 6. Firemonkey - Xử lý tin nhắn
- 7. Xử lý không đồng bộ Django
- 8. Nhắn tin nhẹ (lời gọi không đồng bộ) trong Java
- 9. Thông báo thời gian đến của tin nhắn Rabbitmq
- 10. Gửi tin nhắn đến khách hàng cụ thể với socket.io và hàng đợi tin nhắn rỗng
- 11. Cách xử lý không đồng bộ?
- 12. Xử lý tin nhắn AeroSnap trong WndProc
- 13. RabbitMQ, Pika và chiến lược kết nối lại
- 14. Tiêu thụ không xác nhận tin nhắn từ RabbitMq
- 15. Xử lý đồng thời/xử lý đồng bộ Ruby (với trường hợp sử dụng đơn giản)
- 16. Mẫu thiết kế để xử lý nhiều loại tin nhắn
- 17. Xử lý không đồng bộ trong C++
- 18. Đặt hàng các tin nhắn
- 19. Đồng bộ Đợi tin nhắn trong Web-Worker
- 20. Gửi tin nhắn cho khách hàng qua socket.id
- 21. Xử lý bên máy chủ không đồng bộ WCF
- 22. C# RabbitMQ An toàn chủ đề của khách hàng
- 23. Xử lý tin nhắn Poison trong WCF MSMQ 4.0
- 24. Gọi đồng bộ hoặc không đồng bộ của trình xử lý sự kiện trong javascript
- 25. Xử lý không đồng bộ hoặc hàng đợi thư trong PHP (CakePHP)
- 26. Mẫu tốt nhất để thiết kế một ứng dụng RPC không đồng bộ bằng Python, Pika và AMQP là gì?
- 27. Cách liên lạc RabbitMQ (thư viện Pika) trong ứng dụng lốc xoáy
- 28. Xử lý lỗi SQL Server: ngoại lệ và hợp đồng cơ sở dữ liệu-khách hàng
- 29. Vòng tin nhắn Erlang
- 30. Whats cách tốt nhất để xử lý hàng đợi không đồng bộ liên tục trong Java là gì?