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