如何并行处理两个递归Try Except块(Python)

问题描述 投票:-1回答:1

我有一个Python脚本,该脚本可以无限期地连接到SQL Server和ActiveMQ服务器,并且我正在尝试构建可以分别处理两者断开连接的内容。每当连接断开时,我都想重新连接到服务器。但是,ActiveMQ连接断开连接的频率比SQL连接断开的频率要高得多,我不想因为ActiveMQ连接断开而多次重新连接到SQL Server。

这是我到目前为止所拥有的:

def connectSQL(host, port):
    try:
        time.sleep(5)
        connSQL = pyodbc.connect(driver='{ODBC Driver 17 for SQL Server}',
                           server=sqlserver,
                           database=sqldb,
                           uid=sqluser,pwd=sqlpassword)
        cursor = connSQL.cursor()

        def connectActiveMQ(host, port):
            try:
                time.sleep(5)           
                conn = stomp.Connection(host_and_ports = [(host, port)],heartbeats=(1000, 1000))
                conn.set_listener('', MyListener(conn))
                connect_and_subscribe(conn)
                print("Deployed ActiveMQ listener ...")
                while True:
                    time.sleep(10)
            except:
                print("ActiveMQ connection broke, redeploying listener")
                connectActiveMQ(host, port)

        connectActiveMQ(host,port)
        #Here is a ValueError representing a SQL disconnect
        raise ValueError('SQL connection broke')

    except:
        print("SQL connection broke, reconnecting to SQL")
        connectSQL(host, port)

connectSQL(host,port)

这非常适合于重新连接到ActiveMQ,但不适用于SQL。一旦它已经连接到SQL,由于ActiveMQ循环,任何错误都变得不可访问(如果两个连接都经过一会儿,在此代码中,raise ValueError“ SQL连接中断”将变得不可访问)。我需要连接无限期地运行,但是我不知道我还能在哪里放置while:True等待语句。

如何重写此代码,以便可以无限期并行捕获ActiveMQ和SQL断开连接?

python sql exception activemq
1个回答
2
投票

快速修复:使用线程或多处理。这是一个使用线程的代码段。

import threading

def connectSQL(host, port):
    try:
        time.sleep(5)
        connSQL = pyodbc.connect(driver='{ODBC Driver 17 for SQL Server}',
                                server=sqlserver,
                                database=sqldb,
                                uid=sqluser,pwd=sqlpassword)
        cursor = connSQL.cursor()
        raise ValueError('SQL connection broke')
    except:
        print("SQL connection broke, reconnecting to SQL")
        connectSQL(host, port)

def connectActiveMQ(host, port):
    try:
        time.sleep(5)           
        conn = stomp.Connection(host_and_ports = [(host, port)],heartbeats=(1000, 1000))
        conn.set_listener('', MyListener(conn))
        connect_and_subscribe(conn)
        print("Deployed ActiveMQ listener ...")
        while True:
            time.sleep(10)
    except:
        print("ActiveMQ connection broke, redeploying listener")
        connectActiveMQ(host, port)


t1 = threading.Thread(target=connectActiveMQ, args=(host, port))
t2 = threading.Thread(target=connectSQL, args=(host, port))
t1.start()
t2.start()

P.S。有了该快速修复程序,您绝对应该研究以上注释,以重构各个功能connectSQLconnectActiveMQ。如果需要在方法之间共享数据,请查看here

© www.soinside.com 2019 - 2024. All rights reserved.