Since the _PollingTimer can be reused for a possible console support, why not to make it a public "simil reactor"?
As an example:
class UPollReactor(object): """User mode polling reactor, for Windows.
Note that this is not a real reactor. """
def addResource(self, resource, action): ...
def run(): # add a fake resource, just to do the job done by twistd with the # TimeService ...
twistd can, as an example, always "run" the UPollReactor when on a windows system.
Regards Manlio Perillo
On Sun, 01 Oct 2006 19:06:46 +0200, Manlio Perillo manlio_perillo@libero.it wrote:
Since the _PollingTimer can be reused for a possible console support, why not to make it a public "simil reactor"?
As an example:
class UPollReactor(object): """User mode polling reactor, for Windows.
Note that this is not a real reactor.
"""
def addResource(self, resource, action): ...
def run(): # add a fake resource, just to do the job done by twistd with the # TimeService ...
twistd can, as an example, always "run" the UPollReactor when on a windows system.
Huh?
Jean-Paul
Jean-Paul Calderone ha scritto:
On Sun, 01 Oct 2006 19:06:46 +0200, Manlio Perillo manlio_perillo@libero.it wrote:
Since the _PollingTimer can be reused for a possible console support, why not to make it a public "simil reactor"?
As an example:
class UPollReactor(object): """User mode polling reactor, for Windows.
Note that this is not a real reactor.
"""
def addResource(self, resource, action): ...
def run(): # add a fake resource, just to do the job done by twistd with the # TimeService ...
twistd can, as an example, always "run" the UPollReactor when on a windows system.
Huh?
Forget about the run method.
I'm asking for an UPollreactor because I would like to do something like this:
class PollableReader(object): implements(IPushProducer)
def __init__(self, handle, receivedCallback, lostCallback, reactor): self.handle = handle self.receivedCallback = receivedCallback self.lostCallback = lostCallback self.reactor = reactor
def doWork(self): raise NotImplementedError()
def close(self): try: win32api.CloseHandle(self.handle) except pywintypes.error: # You can't close std handles...? pass
def stopProducing(self): self.close()
def pauseProducing(self): self.reactor.addResource(self)
def resumeProducing(self): self.reactor.removeResource(self)
class Win32EventReactorWrapper(object): def __init__(self, reactor): self.reactor = reactor
def addResource(self, rsc): reactor.addEvent(rsc, rsc.handle, "doWork")
def removeResource(self, rsc): reactor.removeEvent(rsc)
Now I can do, as an example:
class ConsoleReader(PollableReader): # implements doWork for a console
class PipeReader(PollableReader): # implements doWork for a pipe
...
# assuming reactor has a name attribute if reactor.name == "win32eventreactor" # do the polling in kernel space stdin = Console(..., Win32EventReactorWrapper(reactor)) else: # do the polling in user space stdin = Console(..., upollreactor)
Console handles can be passed to WaitForSingleObject and friends. They became signaled when input is avaliable.
This means that I can avoid to use the polling when the win32eventreactor is being used, without having to modify the code.
I *really* believed the same was true for anonymous pipes, but this is not the case...
Regards Manlio Perillo