3

我已经发布到 python 和 eventlet 邮件列表,所以如果我看起来不耐烦,我深表歉意。

我在小型(非微型)保留的 ubuntu 11.10 aws 实例上运行 eventlet 0.9.16。

我有一个套接字服务器,它类似于 eventlet 文档中示例中的 echo 服务器。当我第一次开始运行代码时,一切似乎都很好,但我注意到在 10 或 15 小时后,cpu 使用率从大约 1% 变为 99+%。那时我无法与套接字服务器建立进一步的连接。

这是我正在运行的代码:

    def socket_listener(self, port, socket_type): 
        L.LOGG(self._CONN, 0, H.func(), 'Action:Starting|SocketType:%s' % socket_type)   
        listener = eventlet.listen((self._host, port)) 
        listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        pool = eventlet.GreenPool(20000)
        while True: 
            connection, address = listener.accept() 
            connection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            L.LOGG(self._CONN, 0, H.func(), 'IPAddress:%s|GreenthreadsFree:%s|GreenthreadsRunning:%s' % (str(address[0]), str(pool.free()),str(pool.running())))
            pool.spawn_n(self.spawn_socketobject, connection, address, socket_type)
        listener.shutdown(socket.SHUT_RDWR)
        listener.close()

L.LOGG 方法只是将提供的参数记录到 mysql 表中。

我在这样的线程中运行socket_listener:

def listen_phones(self):  
    self.socket_listener(self._port_phone, 'phone') 

t_phones = Thread(target = self.listen_phones)
t_phones.start() 

从我最初的谷歌搜索中,我认为这个问题可能类似于https://lists.secondlife.com/pipermail/eventletdev/2008-October/000140.html报告的错误,但我使用的是新版本的 eventlet不可能吗?

4

2 回答 2

2

如果listener.accept()是非阻塞的,你应该让线程休眠一小段时间,以便操作系统调度器可以将工作分派给其他进程。通过放置来做到这一点

time.sleep(0.03)

while True循环结束时。

于 2012-02-03T07:43:21.233 回答
1

抱歉回复晚了。

没有类似 的代码listener.setblocking(0),因此,它必须表现为阻塞并且不需要睡眠。

另外,请使用类似ps或之类的工具top,至少确保它是吃掉所有 CPU 的 python 进程。

如果问题仍然存在,请向以下任一渠道报告,无论您喜欢哪种方式:

于 2013-01-09T20:23:48.723 回答