我现在正在写一个单播聊天服务器模型,流程如下:
- 发送者向聊天服务器发送消息,在消息中服务器还指定消息接收者ID
- 聊天服务器将根据收件人 ID 将消息路由到正确的客户端
我使用 python 标准库 asyncore 实现了聊天服务器模型。我发现一旦客户端连接到服务器,CPU 就会上升(1% 对 24%)。我相信性能受到handle_write函数循环的限制。
是否有更好(例如更高效)的框架来完成我的聊天服务器要求?
提前致谢
当然,我们需要实际的代码来调试问题。但你主要要问的是:
是否有更好(例如更高效)的框架来完成我的聊天实现?
是的。人们普遍认为这很asyncore
糟糕。它很难使用并且效率低下。在 Windows 上尤其糟糕,因为select
在 Windows 上尤其糟糕。
所以,是的,使用不同的框架可能会让事情变得更好。
不幸的是,一个 SO 问题不是获得框架建议的好地方,但我可以抛出一个常见的嫌疑人列表:twisted、monocle、gevent、eventlet、tulip。
或者,如果您不担心超过几十个客户端的可扩展性,只关心小规模的性能,每个客户端使用一个线程(甚至两个线程,一个用于读取,一个用于写入)并阻塞 I/O非常简单。
最后,如果你一直在使用 Python 3.x,那么 3.4 很有可能会有一个新的和改进的异步 I/O 模块,它比它更高效、更容易使用asyncore
(而且几乎肯定会基于tulip
)。所以……最好的解决办法可能是买一台时光机,再往前走几个月。(或者,如果您是将来寻找此答案的读者,请查看IPC下的标准库并猜测哪个模块是新的和改进的异步 I/O 模块。)
我刚从网上读到,谈论不同 python 网络服务器(链接)之间的效率。
我想我会使用 gevent,因为它非常有效(似乎)。