我目前正在使用ZeroMQ创建一个实用程序,该实用程序将使我可以将对象发布到可以在网络上看到的某种工作空间中。我正计划在小型LAN网络中使用它,以轻松地检索和同步一些数据。
我想出的方法有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.
在任何时候由于可能发生的错误而导致异常的情况,都应该提出。