class documentation

class AsyncioSelectorReactor(PosixReactorBase): (source)

Implements interfaces: twisted.internet.interfaces.IReactorFDSet

View In Hierarchy

Reactor running on top of asyncio.SelectorEventLoop.

On POSIX platforms, the default event loop is asyncio.SelectorEventLoop. On Windows, the default event loop on Python 3.7 and older is asyncio.WindowsSelectorEventLoop, but on Python 3.8 and newer the default event loop is asyncio.WindowsProactorEventLoop which is incompatible with AsyncioSelectorReactor. Applications that use AsyncioSelectorReactor on Windows with Python 3.8+ must call asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) before instantiating and running AsyncioSelectorReactor.

Method __init__ Undocumented
Method add​Reader I add reader to the set of file descriptors to get read events for.
Method add​Writer I add writer to the set of file descriptors to get write events for.
Method call​From​Thread See twisted.internet.interfaces.IReactorFromThreads.callFromThread.
Method call​Later See twisted.internet.interfaces.IReactorTime.callLater.
Method crash See twisted.internet.interfaces.IReactorCore.crash.
Method get​Readers Return the list of file descriptors currently monitored for input events by the reactor.
Method get​Writers Return the list file descriptors currently monitored for output events by the reactor.
Method iterate See twisted.internet.interfaces.IReactorCore.iterate.
Method remove​All Remove all readers and writers.
Method remove​Reader Removes an object previously added with addReader.
Method remove​Writer Removes an object previously added with addWriter.
Method run Fire 'startup' System Events, move the reactor to the 'running' state, then run the main loop until it is stopped with stop() or crash().
Method stop See twisted.internet.interfaces.IReactorCore.stop.
Class Variable seconds Get the current time in seconds.
Method _move​Call​Later​Sooner Undocumented
Method _on​Timer Undocumented
Method _read​Or​Write Undocumented
Method _reschedule Undocumented
Method _unregister​FDIn​Asyncio Compensate for a bug in asyncio where it will not unregister a FD that it cannot handle in the epoll loop. It touches internal asyncio code.
Class Variable _async​Closed Undocumented
Class Variable _log Undocumented
Instance Variable _asyncio​Eventloop Undocumented
Instance Variable _continuous​Polling Undocumented
Instance Variable _just​Stopped Undocumented
Instance Variable _readers Undocumented
Instance Variable _scheduled​At Undocumented
Instance Variable _timer​Handle Undocumented
Instance Variable _writers Undocumented

Inherited from PosixReactorBase:

Method adopt​Datagram​Port Add an existing listening SOCK_DGRAM socket to the reactor to monitor for read and write readiness.
Method adopt​Stream​Connection
Method adopt​Stream​Port Create a new IListeningPort from an already-initialized socket.
Method connect​SSL Connect a client Protocol to a remote SSL socket.
Method connect​TCP Connect a TCP client.
Method connect​UNIX Connect a client protocol to a UNIX socket.
Method connect​UNIXDatagram Connects a ConnectedDatagramProtocol instance to a path.
Method install​Waker Install a `waker' to allow threads and signals to wake up the IO thread.
Method listen​Multicast Connects a given DatagramProtocol to the given numeric UDP port.
Method listen​SSL Connects a given protocol factory to the given numeric TCP/IP port. The connection is a SSL one, using contexts created by the context factory.
Method listen​TCP Connects a given protocol factory to the given numeric TCP/IP port.
Method listen​UDP Connects a given DatagramProtocol to the given numeric UDP port.
Method listen​UNIX Listen on a UNIX socket.
Method listen​UNIXDatagram Connects a given DatagramProtocol to the given path.
Method spawn​Process Spawn a process, with a process protocol.
Instance Variable waker Undocumented
Method _handle​Signals Extend the basic signal handling logic to also support handling SIGCHLD to know when to try to reap child processes.
Method _remove​All Remove all readers and writers, and list of removed IReadDescriptors and IWriteDescriptors.
Method _uninstall​Handler If a child waker was created and installed, uninstall it now.
Class Variable _supported​Address​Families Undocumented
Instance Variable _child​Waker None or a reference to the _SIGCHLDWaker which is used to properly notice child process termination.

Inherited from _SignalReactorMixin (via PosixReactorBase):

Method main​Loop Undocumented
Method start​Running Extend the base implementation in order to remember whether signal handlers should be installed later.
Method _really​Start​Running Extend the base implementation by also installing signal handlers, if self._installSignalHandlers is true.
Instance Variable _install​Signal​Handlers A flag which indicates whether any signal handlers will be installed during startup. This includes handlers for SIGCHLD to monitor child processes, and SIGINT, SIGTERM, and SIGBREAK to stop the reactor.

Inherited from _DisconnectSelectableMixin (via PosixReactorBase):

Method _disconnect​Selectable Utility function for disconnecting a selectable.

Inherited from ReactorBase (via PosixReactorBase):

Method add​System​Event​Trigger See twisted.internet.interfaces.IReactorCore.addSystemEventTrigger.
Method call​In​Thread See twisted.internet.interfaces.IReactorInThreads.callInThread.
Method call​When​Running See twisted.internet.interfaces.IReactorCore.callWhenRunning.
Method disconnect​All Disconnect every reader, and writer in the system.
Method do​Iteration Do one iteration over the readers and writers which have been added.
Method fire​System​Event See twisted.internet.interfaces.IReactorCore.fireSystemEvent.
Method get​Delayed​Calls No summary
Method get​Thread​Pool See twisted.internet.interfaces.IReactorThreads.getThreadPool.
Method remove​System​Event​Trigger See twisted.internet.interfaces.IReactorCore.removeSystemEventTrigger.
Method resolve Return a Deferred that will resolve a hostname.
Method run​Until​Current Run all pending timed calls.
Method sig​Break Handle a SIGBREAK interrupt.
Method sig​Int Handle a SIGINT interrupt.
Method sig​Term Handle a SIGTERM interrupt.
Method start​Running Method called when reactor starts: do some initialization and fire startup events.
Method suggest​Thread​Pool​Size See twisted.internet.interfaces.IReactorThreads.suggestThreadPoolSize.
Method timeout Determine the longest time the reactor may sleep (waiting on I/O notification, perhaps) before it must wake up to service a time-related event.
Method wake​Up Wake up the event loop.
Class Variable __name__ Undocumented
Class Variable installed Undocumented
Instance Variable running See IReactorCore.running
Instance Variable thread​Call​Queue Undocumented
Instance Variable threadpool Undocumented
Instance Variable threadpool​Shutdown​ID Undocumented
Instance Variable using​Threads Undocumented
Method _cancel​Call​Later Undocumented
Method _check​Process​Args Check for valid arguments and environment to spawnProcess.
Method _init​Thread​Pool Create the threadpool accessible with callFromThread.
Method _init​Threads Undocumented
Method _insert​New​Delayed​Calls Undocumented
Method _really​Start​Running Method called to transition to the running state. This should happen in the during startup event trigger phase.
Method _stop​Thread​Pool No summary
Class Variable _lock Undocumented
Instance Variable _cancellations Undocumented
Instance Variable _event​Triggers Undocumented
Instance Variable _exit​Signal See _ISupportsExitSignalCapturing._exitSignal
Instance Variable _internal​Readers Undocumented
Instance Variable _new​Timed​Calls Undocumented
Instance Variable _pending​Timed​Calls Undocumented
Instance Variable _register​As​IOThread A flag controlling whether the reactor will register the thread it is running in as the I/O thread when it starts. If True, registration will be done, otherwise it will not be.
Instance Variable _started A flag which is true from the time reactor.run is called until the time reactor.run returns. This is used to prevent calls to reactor.run on a running reactor. This should be replaced with an explicit state machine.
Instance Variable _started​Before Undocumented
Instance Variable _stopped A flag which is true between paired calls to reactor.run and reactor.stop. This should be replaced with an explicit state machine.
Instance Variable _threadpool​Startup​ID Undocumented

Inherited from PluggableResolverMixin (via PosixReactorBase, ReactorBase):

Method install​Name​Resolver See IReactorPluggableNameResolver.
Method install​Resolver See IReactorPluggableResolver.
Instance Variable resolver The installed IResolverSimple.
Property name​Resolver Implementation of read-only IReactorPluggableNameResolver.nameResolver.
Instance Variable _name​Resolver The installed IHostnameResolver.
def __init__(self, eventloop=None): (source)

Undocumented

Parameters
eventloop:Optional[SelectorEventLoop]Undocumented
def addReader(self, reader): (source)
I add reader to the set of file descriptors to get read events for.
Parameters
readerAn IReadDescriptor provider that will be checked for read events until it is removed from the reactor with removeReader.
def addWriter(self, writer): (source)
I add writer to the set of file descriptors to get write events for.
Parameters
writerAn IWriteDescriptor provider that will be checked for write events until it is removed from the reactor with removeWriter.
def callLater(self, seconds, f, *args, **kwargs): (source)
See twisted.internet.interfaces.IReactorTime.callLater.
def crash(self): (source)

See twisted.internet.interfaces.IReactorCore.crash.

Reset reactor state tracking attributes and re-initialize certain state-transition helpers which were set up in __init__ but later destroyed (through use).

def getReaders(self): (source)
Return the list of file descriptors currently monitored for input events by the reactor.
Returns
the list of file descriptors monitored for input events.
def getWriters(self): (source)
Return the list file descriptors currently monitored for output events by the reactor.
Returns
the list of file descriptors monitored for output events.
def iterate(self, timeout): (source)
See twisted.internet.interfaces.IReactorCore.iterate.
def removeAll(self): (source)

Remove all readers and writers.

Should not remove reactor internal reactor connections (like a waker).

Returns
A list of IReadDescriptor and IWriteDescriptor providers which were removed.
def removeReader(self, reader): (source)
def removeWriter(self, writer): (source)
def run(self, installSignalHandlers=True): (source)
Fire 'startup' System Events, move the reactor to the 'running' state, then run the main loop until it is stopped with stop() or crash().
def stop(self): (source)
See twisted.internet.interfaces.IReactorCore.stop.
seconds = (source)
Get the current time in seconds.
Returns
A number-like object of some sort.
def _moveCallLaterSooner(self, tple): (source)
def _onTimer(self): (source)

Undocumented

def _readOrWrite(self, selectable, read): (source)

Undocumented

def _reschedule(self): (source)

Undocumented

def _unregisterFDInAsyncio(self, fd): (source)

Compensate for a bug in asyncio where it will not unregister a FD that it cannot handle in the epoll loop. It touches internal asyncio code.

A description of the bug by markrwilliams:

The add_writer method of asyncio event loops isn't atomic because all the Selector classes in the selector module internally record a file object before passing it to the platform's selector implementation. If the platform's selector decides the file object isn't acceptable, the resulting exception doesn't cause the Selector to un-track the file object.

The failing/hanging stdio test goes through the following sequence of events (roughly):

* The first connection.write(intToByte(value)) call hits the asyncio reactor's addWriter method.

* addWriter calls the asyncio loop's add_writer method, which happens to live on _BaseSelectorEventLoop.

* The asyncio loop's add_writer method checks if the file object has been registered before via the selector's get_key method.

* It hasn't, so the KeyError block runs and calls the selector's register method

* Code examples that follow use EpollSelector, but the code flow holds true for any other selector implementation. The selector's register method first calls through to the next register method in the MRO

* That next method is always _BaseSelectorImpl.register which creates a SelectorKey instance for the file object, stores it under the file object's file descriptor, and then returns it.

* Control returns to the concrete selector implementation, which asks the operating system to track the file descriptor using the right API.

* The operating system refuses! An exception is raised that, in this case, the asyncio reactor handles by creating a _ContinuousPolling object to watch the file descriptor.

* The second connection.write(intToByte(value)) call hits the asyncio reactor's addWriter method, which hits the add_writer method. But the loop's selector's get_key method now returns a SelectorKey! Now the asyncio reactor's addWriter method thinks the asyncio loop will watch the file descriptor, even though it won't.

_asyncClosed: bool = (source)

Undocumented

_log = (source)

Undocumented

_asyncioEventloop: SelectorEventLoop = (source)

Undocumented

_continuousPolling = (source)

Undocumented

Undocumented

_scheduledAt = (source)

Undocumented

_timerHandle = (source)

Undocumented

Undocumented