Как справиться с асинхронностью внутри класса в Python, ничего не блокируя?

Мне нужно создать класс, который может получать и хранить SMTP-сообщения, то есть электронную почту. Для этого я используюasyncore согласно приведенному примеруВот, Тем не мение,asyncore.loop() блокирует, поэтому я не могу больше ничего делать в коде.

Поэтому я подумал об использовании потоков. Вот пример кода, который показывает, что я имею в виду:

class MyServer(smtpd.SMTPServer):
    # derive from the python server class

    def process_message(..):
        # overwrite a smtpd.SMTPServer method to be able to handle the received messages
        ...
        self.list_emails.append(this_email)

    def get_number_received_emails(self):
        """Return the current number of stored emails"""
        return len(self.list_emails)


    def start_receiving(self):
        """Start the actual server to listen on port 25"""

        self.thread =   threading.Thread(target=asyncore.loop)
        self.thread.start()     

    def stop(self):
        """Stop listening now to port 25"""
        # close the SMTPserver from itself
        self.close()
        self.thread.join()

Я надеюсь, что вы получите картину. КлассMyServer должен иметь возможность запускать и останавливать прослушивание порта 25 неблокирующим способом, иметь возможность запрашивать сообщения во время прослушивания (или нет).start метод запускаетasyncore.loop() слушатель, который, когда происходит получение электронного письма, добавляется во внутренний список. Похоже,stop метод должен быть в состоянии остановить этот сервер, как предложеноВот.

Несмотря на то, что этот код работает не так, как я ожидаю (asyncore, кажется, работает вечно, даже я называю вышеstop метод.error Я поднимаю пойман внутриstop, но не в пределахtarget функция, содержащаяasyncore.loop()), Я не уверен, что мой подход к проблеме имеет смысл. Любые предложения по исправлению приведенного выше кода или более надежной реализации (без с использованием стороннего программного обеспечения), приветствуются.

Ответы на вопрос(4)

Ваш ответ на вопрос