我已经发布到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,所以肯定不是吗?
答案 0 :(得分:2)
如果listener.accept()
是非阻塞的,则应该让线程暂停一小段时间,以便os调度程序可以将工作分派给其他进程。通过
time.sleep(0.03)
在while True
循环结束时。
答案 1 :(得分:1)
很抱歉迟到的回复。
没有类似listener.setblocking(0)
的代码,因此,它必须表现为阻塞,不需要睡眠。
另外,请使用像ps
或top
这样的工具来至少确保它是吃掉所有CPU的python进程。
如果问题仍然存在,请将其报告给其中一个频道,无论您喜欢哪个频道: