Make Sync Client and Server reusable#1503
Conversation
Reopen ThreadLoop if stopped previously analogous to init Fixes FreeOpcUa#1364
| self.tloop = ThreadLoop() | ||
| self.tloop.start() | ||
| self.close_tloop = True | ||
| self.tloop.post(self.aio_obj.connect()) |
There was a problem hiding this comment.
we cannot have the same code several places. At least put that code in a method.
also if you want to delay threadloop initializatin, you might need to do it at several places not only here... there is a connect_sessionless method for example and maybe others...
| self.tloop = ThreadLoop() | ||
| self.tloop.start() | ||
| self.close_tloop = True | ||
| self.tloop.post(self.aio_obj.start()) |
There was a problem hiding this comment.
arrg same code again... Making that class re-usable might not be a good idea. there is probably a reason, threading.Thread is not reusable...
There was a problem hiding this comment.
Thanks for your time and effort, but could you clarify further, since I'm not quite sure in what way initializing a new Thread or ThreadLoop could pose a problem in this context.
There was a problem hiding this comment.
I was simply refering to the fact the threading.Thread in the python standard library does not allow re-use. We copied their API when creating that class. We can make that class reusable, but I see your code over is not really clean, so maybe it is hard to solve that issue in a safe way...
43f83d0 to
8dab330
Compare
As the issue #1364 suggests, OpcUa Client (and Server) are not reusable, since disconnecting the client or stopping the server, stops the Sync Wrapper's ThreadLoop respectively and therefore lead to ThreadLoopNotRunnning exceptions on any call that depends on the ThreadLoop.
As in the discussion of #1364 the Sync Wrapper should start the ThreadLoop on connection (or server.start) if ThreadLoop is not alive anymore.
This proposed behaviour has been implemented in this PR.