I'm writing application that uses python Twisted API (namely WebSocketClientProtocol, WebSocketClientFactory, ReconnectiongClientFactory. I want to wrap client factory into reader with following interface
class Reader:
def start(self):
pass
def stop(self):
pass
Start function will be used to open connection (i.e. connect on ws api and start reading data), while stop will stop such connection.
My issue is that if I use reactor.run() inside start, connection starts and everything is OK, but my code never goes pass that line (looks like blocking call to me) and I cannot execute subsequent lines (include .stop in my tests).
I have tried using variants such as reactor.callFromThread(reactor.run) and reactor.callFromThread(reactor.stop) or even excplicity calling Thread(target=...) but none seems to work (they usually don't build protocol or open connection at all).
Any help or guidelines on how to implement Reader.start and Reader.stop are welcome.
If you put
reactor.runinsideReader.startthenReaderwill be a difficult component to use alongside other code. Your difficulties are just the first symptom of this.Calling
reactor.runandreactor.stopare the job of code responsible for managing the lifetime of your application. Put those calls somewhere separate from your WebSocket application code. For example:Or better yet, implement a twist(d) plugin and let twist(d) manage the reactor for you.