2323from . import transports
2424from . import trsock
2525from .log import logger
26+ from ._selector_thread import SelectorThread as _SelectorThread
2627
2728
2829def _set_socket_extra (transport , sock ):
@@ -633,6 +634,7 @@ def __init__(self, proactor):
633634 logger .debug ('Using proactor: %s' , proactor .__class__ .__name__ )
634635 self ._proactor = proactor
635636 self ._selector = proactor # convenient alias
637+ self ._selector_thread = None
636638 self ._self_reading_future = None
637639 self ._accept_futures = {} # socket file descriptor => Future
638640 proactor .set_loop (self )
@@ -641,6 +643,17 @@ def __init__(self, proactor):
641643 # wakeup fd can only be installed to a file descriptor from the main thread
642644 signal .set_wakeup_fd (self ._csock .fileno ())
643645
646+ def _get_selector_thread (self ):
647+ """Return the SelectorThread.
648+
649+ creating it on first request,
650+ so no thread is created until/unless
651+ the first call to `add_reader` and friends.
652+ """
653+ if self ._selector_thread is None :
654+ self ._selector_thread = _SelectorThread (self )
655+ return self ._selector_thread
656+
644657 def _make_socket_transport (self , sock , protocol , waiter = None ,
645658 extra = None , server = None ):
646659 return _ProactorSocketTransport (self , sock , protocol , waiter ,
@@ -697,10 +710,25 @@ def close(self):
697710 self ._proactor .close ()
698711 self ._proactor = None
699712 self ._selector = None
713+ if self ._selector_thread is not None :
714+ self ._selector_thread .close ()
715+ self ._selector_thread = None
700716
701717 # Close the event loop
702718 super ().close ()
703719
720+ def add_reader (self , fd , callback , * args ):
721+ return self ._get_selector_thread ().add_reader (fd , callback , * args )
722+
723+ def remove_reader (self , fd ):
724+ return self ._get_selector_thread ().remove_reader (fd )
725+
726+ def add_writer (self , fd , callback , * args ):
727+ return self ._get_selector_thread ().add_writer (fd , callback , * args )
728+
729+ def remove_writer (self , fd ):
730+ return self ._get_selector_thread ().remove_writer (fd )
731+
704732 async def sock_recv (self , sock , n ):
705733 return await self ._proactor .recv (sock , n )
706734
0 commit comments