Jak obsługiwać asyncore w klasie w Pythonie, bez blokowania czegokolwiek?

Muszę utworzyć klasę, która może odbierać i przechowywać wiadomości SMTP, tj. Wiadomości e-mail. Aby to zrobić, używamasyncore według zamieszczonego przykładututaj. Jednak,asyncore.loop() blokuje, więc nie mogę zrobić nic innego w kodzie.

Więc pomyślałem o użyciu wątków. Oto przykładowy kod, który pokazuje, co mam na myśli:

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

Mam nadzieję, że dostaniesz zdjęcie. KlasaMyServer powinien być w stanie rozpocząć i przestać słuchać portu 25 w sposób nieblokujący się, może być zapytany o wiadomości podczas słuchania (lub nie). Thestart metoda rozpoczynaasyncore.loop() słuchacz, który po otrzymaniu wiadomości e-mail dołącza się do wewnętrznej listy. Podobnystop zgodnie z sugestią metoda powinna być w stanie zatrzymać ten serwertutaj.

Pomimo tego, że ten kod nie działa tak, jak się tego spodziewam (asyncore wydaje się działać wiecznie, nawet ja nazywam to powyżej)stop metoda. Theerror Podnoszę, jest w środkustop, ale nie wewnątrztarget funkcja zawierającaasyncore.loop()), Nie jestem pewien, czy moje podejście do problemu jest sensowne. Wszelkie sugestie dotyczące poprawienia powyższego kodu lub zaproponowania bardziej solidnej implementacji (bez korzystanie z oprogramowania innych firm).

questionAnswers(4)

yourAnswerToTheQuestion