Python占用了99%的CPU运行eventlet

时间:2012-02-03 05:29:45

标签: python eventlet

我已经发布到python和eventlet邮件列表,所以如果我似乎不耐烦,我会道歉。

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

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

这是我正在运行的代码:

    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,所以肯定不是吗?

2 个答案:

答案 0 :(得分:2)

如果listener.accept()是非阻塞的,则应该让线程暂停一小段时间,以便os调度程序可以将工作分派给其他进程。通过

来做到这一点
time.sleep(0.03)

while True循环结束时。

答案 1 :(得分:1)

很抱歉迟到的回复。

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

另外,请使用像pstop这样的工具来至少确保它是吃掉所有CPU的python进程。

如果问题仍然存在,请将其报告给其中一个频道,无论您喜欢哪个频道: