Как обрабатывать два рекурсивных блока Try Except параллельно (Python) - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть сценарий Python, который неограниченно подключается к SQL серверу и серверу ActiveMQ, и я пытаюсь создать что-то, что может обрабатывать разъединения для обоих по отдельности. Всякий раз, когда разрывается соединение, я хочу подключиться к серверу. Однако подключение ActiveMQ отключается гораздо чаще, чем подключение SQL, и я не хочу повторно подключаться к серверу SQL несколько раз только потому, что один ActiveMQ поврежден.

Вот что У меня так далеко:

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 l oop (повышение ValueError "SQL соединение разорвано" становится недоступным в этом коде, если оба соединения go проходят даже на мгновение) , Мне нужно, чтобы соединение работало бесконечно, но я не знаю, куда еще я могу поместить оператор while: True wait.

Как я могу переписать это, чтобы я мог перехватывать как ActiveMQ, так и SQL разъединения параллельно на неопределенный срок?

1 Ответ

2 голосов
/ 05 февраля 2020

Быстрое исправление: используйте многопоточность или многопоточность. Вот фрагмент кода с использованием многопоточности.

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

PS Учитывая данное исправление, вы должны обязательно изучить комментарии выше, чтобы реорганизовать отдельные функции connectSQL и connectActiveMQ. Если вам нужно обмениваться данными между методами, посмотрите здесь .

...