Como lidar com asyncore dentro de uma classe em python, sem bloquear nada?

Eu preciso criar uma classe que possa receber e armazenar mensagens SMTP, ou seja, e-mails. Para fazer isso, estou usandoasyncore de acordo com um exemplo postadoAqui. Contudo,asyncore.loop() está bloqueando, então não posso fazer mais nada no código.

Então pensei em usar threads. Aqui está um exemplo de código que mostra o que tenho em mente:

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()

Eu espero que você entenda a foto. A classeMyServer deve ser capaz de iniciar e parar de escutar a porta 25 de forma não-bloqueante, podendo ser consultada para mensagens enquanto escuta (ou não). ostart método inicia oasyncore.loop() ouvinte, que, quando ocorre a recepção de um email, anexa a uma lista interna. Semelhante, ostop método deve ser capaz de parar este servidor, como sugeridoAqui.

Apesar do fato de este código não funcionar como eu esperava (asyncore parece correr para sempre, até eu chamo o acimastop método. oerror Eu levanto é apanhado dentrostop, mas não dentro dotarget função contendoasyncore.loop()), Não tenho certeza se minha abordagem ao problema é sensata. Quaisquer sugestões para corrigir o código acima ou propor uma implementação mais sólida (sem usando software de terceiros), são apreciados.

questionAnswers(4)

yourAnswerToTheQuestion