单线程
对于只有一个进程一个线程一个 amqp 连接的情况
我们开了一个连接用来任务消费,这个时候,我们需要一个『后台』来帮我们维护 amqp 的心跳
怎么实现这个『后台』呢?
选择其实很多,比如:
- 线程
- eventlet 协程
- gevent 协程
下面就以 『eventlet 协程』 举例子了
from kombu import Connection, Consumer, Queue
from kombu import Exchange, Queue
from loguru import logger
from kombu.transport.pyamqp import Message
import time
import eventlet
eventlet.monkey_patch()
amqp_uri = 'amqp://pon:pon@192.168.31.245:5672//'
flag = 0
def handle_message(message: Message):
logger.debug(message.body)
message.ack()
refresh_exchange = Exchange('refresh', type='topic')
imdb_queue = Queue('imdb', refresh_exchange,
routing_key='to_imdb', durable=True)
heartbeat_interval = 5
def heartbeat_check_forever(heartbeat_interval: int | float = None):
while True:
conn.heartbeat_check()
logger.debug(f'心跳检查完成')
time.sleep(heartbeat_interval/2/2 if heartbeat_interval else 1)
with Connection(amqp_uri, heartbeat=heartbeat_interval) as conn:
with conn.channel() as channel:
consumer = Consumer(channel, queues=[imdb_queue], prefetch_count=10)
consumer.on_message(handle_message)
with consumer:
eventlet.spawn_n(heartbeat_check_forever, heartbeat_interval)
while True:
conn.drain_events()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。