【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 
            
class Waker(interface.Waker):
     """Create an OS independent asynchronous pipe.
    For use on platforms that don't have os.pipe() (or where pipes cannot
     be passed to select()), but do have sockets.  This includes Windows
     and Jython.
     """
     def __init__(self):    #让os自动分配一个socket
         # Based on Zope select_trigger.py:
         self.writer = socket.socket()
         # Disable buffering -- pulling the trigger sends 1 byte,
         # and we want that sent immediately, to wake up ASAP.
         self.writer.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        count = 0
         while 1:
             count += 1
             a = socket.socket()
             a.bind(("127.0.0.1", 0))
             a.listen(1)
             connect_address = a.getsockname()  # ('127.0.0.1', 46816)  获取到os分配的socket连接信息
             try:
                 self.writer.connect(connect_address)
                 break    # success
             except socket.error as detail:
                 if (not hasattr(errno, 'WSAEADDRINUSE') or
                         detail[0] != errno.WSAEADDRINUSE):
                     # "Address already in use" is the only error
                     # I've seen on two WinXP Pro SP2 boxes, under
                     # Pythons 2.3.5 and 2.4.1.
                     raise
                 # (10048, 'Address already in use')
                 # assert count <= 2 # never triggered in Tim's tests
                 if count >= 10:  # I've never seen it go above 2
                     a.close()
                     self.writer.close()
                     raise socket.error("Cannot bind trigger!")
                 # Close `a` and try again.  Note:  I originally put a short
                 # sleep() here, but it didn't appear to help or hurt.
                 a.close()
        self.reader, addr = a.accept()
         self.reader.setblocking(0)
         self.writer.setblocking(0)
         a.close()
         self.reader_fd = self.reader.fileno()
    def fileno(self):
         return self.reader.fileno()
    def write_fileno(self):
         return self.writer.fileno()
    def wake(self):
         try:
             self.writer.send(b"x")
         except (IOError, socket.error):
             pass
    def consume(self):
         try:
             while True:
                 result = self.reader.recv(1024)
                 if not result:
                     break
         except (IOError, socket.error):
             pass
    def close(self):
         self.reader.close()
         self.writer.close()
来源:oschina
链接:https://my.oschina.net/u/2300652/blog/798716