【发布时间】:2014-06-16 18:10:03
【问题描述】:
我在为每条消息执行一些任务的消费者中使用pika.BlockingConnection。我还添加了信号处理,以便消费者在完成所有任务后正常死亡。
在处理消息并收到信号时,我只是从函数中得到"signal received",但代码没有退出。所以,我决定也检查回调函数结束时收到的信号。问题是,我要检查多少次信号,因为这段代码中会有更多的功能。有没有更好的方法来处理信号而不做过多的事情?
import signal
import sys
import pika
from time import sleep
received_signal = False
all_over = False
def signal_handler(signal, frame):
global received_signal
print "signal received"
received_signal = True
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
mq_connection = pika.BlockingConnection(pika.ConnectionParameters(my_mq_server, virtual_host='test'))
mq_channel = mq_connection.channel()
def callback(ch, method, properties, body):
if received_signal:
print "Exiting, as a kill signal is already received"
exit(0)
print body
sleep(50)
mq_channel.basic_ack(delivery_tag=method.delivery_tag)
print "Message consumption complete"
if received_signal:
print "Exiting, as a kill signal is already received"
exit(0)
try:
print ' [*] Waiting for messages. To exit press CTRL+C'
mq_channel.basic_consume(callback, queue='test')
mq_channel.start_consuming()
except Exception:
mq_channel.close()
exit()
这是我在这里的第一个问题,如果需要更多详细信息,请告诉我。
【问题讨论】:
-
您当前的代码将吞下 SIGTERM 或 SIGINT 直到通过队列接收到下一条消息,此时它应该退出。这真的是你想要的吗?为什么不让
signal_handler方法直接调用sys.exit(0)? -
我希望信号处理以两种方式完成:1)在等待消息时,它应该只是死掉 2)在消费消息时,它应该完成当前工作,然后死掉。我当前的代码包含第二个条件,但不是第一个条件。这就是问题。这可能吗?
-
是的,这是可能的。我会添加一个答案。
标签: python signals signal-handling pika