ValueError:信号仅在连接到BIG IP设备时在主线程错误中起作用

时间:2018-05-31 07:36:16

标签: python multithreading flask

下面是烧瓶应用模块:

@app.route('/service', methods=['POST'])
def service():
    postData = request.data

    try:
        mgmt = src.connect();
        src.execute(mgmt);
        return "request completed"
    except Exception, e:
        return ("Exception occured" + str(e));



if __name__ == "__main__":
    app.run(port=5050, debug=True, use_reloader=False)
    #app.run(port=5050);

以下是连接模块:

def connect():

    try:
        config = ConfigParser.ConfigParser()
        config.readfp(open(r'./config.ini'))
        cipher_suite = Fernet(config.get('connection','token')) 
        decoded_pass = cipher_suite.decrypt(config.get('connection','hash'))
        # Connect to the BIG-IP device.
        mgmt = ManagementRoot(config.get('connection','ipaddr'),config.get('connection','user'),decoded_pass)
        return mgmt;    
    except Exception as e:
        l
        log.error(e)
        raise e;    

我没有开始一个新的线程,但它抛出 ValueError:信号仅在主线程中工作,同时在下面的步骤中连接到BIG IP,如上所示

mgmt = ManagementRoot(config.get('connection','ipaddr'),config.get('connection','user'),decoded_pass)

我正在使用f5-sdk,其信号使用如下:

        if HAS_SIGNAL:
            signal.signal(SIGALRM, timeout_handler) ## this line throws the error
            signal.alarm(int(self.args['timeout']))
            response = connect.get(base_uri)
            signal.alarm(0)
        else:
            response = connect.get(base_uri) 

2 个答案:

答案 0 :(得分:1)

是的,UNIX信号不能从主线程以外的线程设置。

看起来F5 SDK正在使用信号进行连接超时(这有点傻,但确实如此)。

您可以通过明确告知SDK在应用程序的早期setting the flag没有提供信号来解决此问题:

from f5 import bigip
bigip.HAS_SIGNAL = False  # Override autodetection

当然,另一种解决方法是从主线程连接,但我认为这不是你想要做的事情,无论出于何种原因:)

答案 1 :(得分:0)

我已在我的烧瓶应用模块中添加了以下代码,而不是已注释的代码,以使其正常工作。

# if __name__ == "__main__":
#     app.run(port=5050, debug=True, use_reloader=False)

if __name__ == "__main__":

    from tornado.wsgi import WSGIContainer
    from tornado.httpserver import HTTPServer
    from tornado.ioloop import IOLoop

    http_server = HTTPServer(WSGIContainer(app))
    http_server.listen(5050)
    IOLoop.instance().start()