Python: Как добавить хуки для управления (остановка / запуск / пауза / возобновление) бесконечного цикла из второй программы? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть код, который запускает цикл while и работает, пока я не убью его с помощью Control-C.Я хотел бы сделать это немного лучше, добавив некоторый способ взаимодействия с кодом, чтобы сделать его более изящным.В конце концов, я хотел бы управлять этим из приложения PyQt с помощью кнопки «Пуск / Стоп» и кнопки «Пауза / Возобновление».Как бы я добавил несколько хуков в код для обеспечения такого рода контроля?

Текущий код выглядит так:

def handle_notifications(dao_notifications):

    # fetch notifications
    while True:

        try:
            # store received notifications into the database
            for notification in next(notifications_generator):
                dao_notifications.insert(notification)

        except StopIteration:
            continue


def notifications_generator():

    # create a socket to listen for notification events
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sockt:

        # bind the listener port of the local host to the socket instance
        sockt.bind((_LOCAL_IP_ADDRESS, _LISTENER_PORT))

        # start the socket listening
        sockt.listen()

        # continually receive notifications and yield
        while True:

            # accept a communication connection on the socket
            connection, connection_address = sockt.accept()
            with connection:

                # receive bytes of data from the socket, decode as Unicode string
                xml = connection.recv(20480).decode("utf-8")

                # only try to yield values if we've actually received data
                if len(xml) > 0:

                    # parse the XML into a dictionary
                    notifications_soap = xmltodict.parse(xml)

                    # yield the notification messages as an iterable
                    notifications = \
                        notifications_soap["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["wsnt:Notify"]["wsnt:NotificationMessage"]
                    yield notifications

Возможно, это вариант использования для обработки сигналов?Например, я могу написать обработчик для SIGINT, чтобы приостановить / приостановить выполнение (продолжайте спать до тех пор, пока не поступит другой сигнал для возобновления), и один для SIGTERM, чтобы изящно очистить перед выходом, тогда приложение PyQt выдаст соответствующие сигналы для управления выполнением.Есть хороший / простой пример этого?

...