Код отлично работает на 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 вопрос . Но я не понял, как обойти это в моем случае.