Как обрабатывать проблемы с подключением, которые происходят в других потоках - PullRequest
0 голосов
/ 21 июня 2019

В настоящее время я использую 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.

В любое время, если возникает исключение из-за возможных ошибок, его следует вызвать.

...