2014-09-14 4 views
2

Linux (우분투 14.04 및 페도라 20)에서 OSX (10.8)보다 20 초 더 걸리는 스레드 된 smtp 서버가 있습니다.파이썬 2.7에서 threaded smtpd와 리눅스와 os x의 동작 차이가 매우 깁니다.

from email.parser import Parser 
from smtpd import SMTPServer as StdLibSmtpServer 
from smtplib import SMTP 
from threading import Thread 
import asyncore 
import re 
import select 
import logging 
import os.path 
import datetime 
import json 
import random 
from socket import gethostname 
class SmtpServer(StdLibSmtpServer, object): 
    def __init__(self, listen='localhost', port=10025, 
      forward_address='localhost', forward_port=10026): 
     super(SmtpServer, self).__init__((listen, port), None) 
     self.forward_address = forward_address 
     self.forward_port = forward_port 
     self._thread = None 
     self._smtp = SMTP() 
     self._should_re_raise_exceptions = False 
    def start(self): 
     if self._thread: 
      raise Exception("Already running") 
     logging.debug("Starting up") 
     self._thread = Thread(target=self._thread_func) 
     self._thread.daemon = True 
     self._thread.start() 
     logging.info("Started") 
    def stop(self): 
     if not self._thread: 
      raise Exception("Not running") 
     logging.debug("Stopping") 
     self.close() 
     self._thread.join() 
     self._thread = None 
     logging.info("Stopped") 
    def _thread_func(self): 
     try: 
      asyncore.loop() 
     except select.error: 
      pass # socket was closed, we are shutting down 

self._thread.join() 행에서 발생하며 그 이유를 파악할 수 있습니다.

문제를 해결하는 방법에 대한 조언이 있으십니까? 내가 수행하여 파일을 실행 :

from test import SmtpServer 
serv = SmtpServer() 
serv.start() 
serv.stop() 

serv.stop()를 리눅스에서 방법 느린 부분입니다.

+1

타임 아웃 값을'self._thread.join()'으로 설정해보십시오 - 즉'self._thread.join (timeout = 0.5);' –

답변

1

그 원인은 epoll 대신 select를 사용하는 시스템에서 제한 시간을 설정해야하는 asyncore.loop()입니다. 이 문제를 도와 준 @binarydud에게 큰 감사드립니다. thread.join에서 짧은 시간 제한을 설정하면 작동하지만 asyncore가 제거 될 수 있습니다.