У меня есть код, который запускает цикл 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 выдаст соответствующие сигналы для управления выполнением.Есть хороший / простой пример этого?