В настоящее время я использую ZeroMQ для создания утилиты, которая позволит мне публиковать объекты в своего рода рабочем пространстве, которое можно увидеть в сети. Я планирую использовать его в небольших сетях ЛВС для простого извлечения и синхронизации некоторых фрагментов данных.
Метод, который я придумал, состоит в том, чтобы иметь 4 потока: поток для передачи запросов в удаленное рабочее пространство (REP-REQ), поток для синхронизации изменений из удаленного рабочего пространства, которые сделали другие клиенты (PUB-SUB) поток, который ставит в очередь все синхронизации и запросы по порядку (PAIR), и поток пользователя (PAIR). Я использую ZeroMQ PAIR сокеты для синхронизации между ними.
Если пользователь пытается выполнить недопустимые операции чтения в рабочей области или недопустимые операции записи, возбуждаемые исключения перехватываются на сервере и передаются обратно пользователю и восстанавливаются в методе чтения или записи их объекта.
Каждый поток инициализируется при создании экземпляра ресурса в операторе «with».
Этот класс можно использовать ТОЛЬКО в качестве ресурса, поэтому все сокеты закрываются правильно, независимо от того, что происходит.
Я использую пульс пинг-понга, чтобы проверить, есть ли у меня соединение с сервером; однако это периодически делается в потоке запросов. Примерно в этот момент я понял, что есть проблема. Если исключения возникают в каком-либо отдельном потоке, предложение моего диспетчера контекста никогда не выполнится, поскольку в этом потоке не было исключений.
Конечно, я мог бы просто вызвать исключение, когда пользователь пытается выполнить чтение, а утилита находится в недопустимом состоянии; однако это кажется не элегантным.
Мой код сейчас очень длинный и откровенно очень грязный, поэтому, если вам нужны какие-то конкретные разделы, просто спросите меня.
Я изучил асинхронные и другие способы возврата исключения, но, похоже, нет действительно ЧИСТЫХ способов сделать это.
Я искал решение и не могу его найти. Любые рекомендации?
Вот пример использования того, что я надеюсь создать.
with RemoteWorkspaceResource("10.13.12.1", "56432") as workspace:
try:
workspace.lookup("myname")
"""
Sometime between these two someone trips over a wire
Heartbeats are missed.
An exception is raised and the resource cleans up.
"""
workspace.publish("myname", "Hector")
except Whaterver as ex:
print(ex)
#Do whatever you need to.
# No need to do cleanup. Resource cleaned itself up.
В любое время, если возникает исключение из-за возможных ошибок, его следует вызвать.