Python DefaultSelector, регистрирующий сокет, получает Bad File Descriptor после двойного форка magi c на MacOS - PullRequest
0 голосов
/ 26 февраля 2020

Код отлично работает на Linux, но не на MacOS Mojave.

Я скопировал класс двойной вилки Daemon из здесь и создал его подкласс. Внутри метода запуска у меня есть следующее:

def run(self):
    # create socket
    lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    lsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    lsock.bind((HOST, PORT))
    lsock.listen()
    self.logger.info("listening on {} {}".format(HOST, PORT))
    lsock.setblocking(False)
    self.__sel.register(lsock, selectors.EVENT_READ, data=None)

    while True:
        self.logger.info("WAIT FOR SELECT")
        # lsock.setblocking(True)
        # The following line throws exception on macOS
        events = self.__sel.select(timeout=None) 
        for key, mask in events:
            pass
        time.sleep(0.02) # yeah should fix this

Я еще не совсем отработал селекторы. Регистрация селектора выполняется на Linux, но не работает на MacOS Mojave. Трассировка исключений:

 Traceback (most recent call last):
  File "./test.py", line 228, in <module>
    daemon.start()
  File "./test.py", line 92, in start
    self.run()
  File "./test.py", line 149, in run
    self.__sel.register(lsock, selectors.EVENT_READ, data=None)
  File "/Users/huggie/anaconda3/lib/python3.7/selectors.py", line 522, in register
    self._selector.control([kev], 0, 0)
OSError: [Errno 9] Bad file descriptor

Я подозреваю, что это аналогичная проблема с другим StackOverflow вопрос . Но я не понял, как обойти это в моем случае.

...