在python2.7中,linux和带有线程smtpd的os x之间存在奇怪的行为差异

2024-06-16 15:57:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个线程化的smtp服务器,在Linux(Ubuntu14.04和Fedora20)上比在OSX(10.8)上需要额外20秒才能停止。你知道吗

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

它发生在自己身上_线程连接()行,我似乎能找出原因。你知道吗

关于如何进一步排除故障有什么建议吗? 我通过执行以下操作运行文件:

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

那个服务停止()是linux上速度慢得多的部分。你知道吗


Tags: fromimportselfnoneportaddressloggingdef
1条回答
网友
1楼 · 发布于 2024-06-16 15:57:31

原来根本原因是异步内核.loop()需要在使用select而不是epoll的系统上设置超时。非常感谢@binarydud的帮助。结果是在线程连接同样有效,但它可能会导致异步内核孤立。你知道吗

相关问题 更多 >