您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

信号处理pika / python

5b51 2022/1/14 8:20:17 python 字数 4878 阅读 484 来源 www.jb51.cc/python

我在消费者中使用pika.BlockingConnection,为每条消息执行一些任务.我还添加了信号处理功能,以便消费者在完成所有任务后正常死亡. 在处理消息并接收到信号时,我只是从函数中获得“信号接收”,但代码不会退出.所以,我决定检查在回调函数结束时收到的信号.问题是,我检查信号的次数是多少,因为此代码中还有更多的功能.是否有更好的处理信号的方法而不会过度使用东西? import signa

概述

在处理消息并接收到信号时,我只是从函数中获得“信号接收”,但代码不会退出.所以,我决定检查在回调函数结束时收到的信号.问题是,我检查信号的次数是多少,因为此代码中还有更多的功能.是否有更好的处理信号的方法而不会过度使用东西?

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()

这是我的第一个问题,如果需要更多细节,请告诉我.

#!/usr/bin/python

import signal
import sys 
import pika
from contextlib import contextmanager

received_signal = False
processing_callback = False

def signal_handler(signal,frame):
    global received_signal
    print "signal received"
    received_signal = True
    if not processing_callback:
         sys.exit()

signal.signal(signal.SIGINT,signal_handler)

@contextmanager
def block_signals():
    global processing_callback
    processing_callback = True
    try:
        yield
    finally:
        processing_callback = False
        if received_signal:
            sys.exit()

def callback(ch,body):
    with block_signals:
        print body
        sum(xrange(0,200050000)) # sleep gets interrupted by signals,this doesn't.
        mq_channel.basic_ack(delivery_tag=method.delivery_tag)
        print "Message consumption complete"

if __name__ == "__main__":    
    try:
        mq_connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
        mq_channel = mq_connection.channel()
        print ' [*] Waiting for messages. To exit press CTRL+C'
        mq_channel.basic_consume(callback,queue='test')
        mq_channel.start_consuming()
    except Exception as e:
        mq_channel.close()
        sys.exit()

我使用了一个上下文管理器来处理阻塞信号,因此所有逻辑都隐藏在回调本身之外.这也应该使重用代码更容易.只是为了澄清它是如何工作的,它等同于:

def callback(ch,body):
    global processing_callback
    processing_callback = True
    try:
        print body
        sum(xrange(0,200050000))
        mq_channel.basic_ack(delivery_tag=method.delivery_tag)
        print "Message consumption complete"
    finally:
        processing_callback = False
        if received_signal:
            sys.exit()

总结

以上是编程之家为你收集整理的信号处理pika / python全部内容,希望文章能够帮你解决信号处理pika / python所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶