python - 提升 python 服务器的性能

标签 python c++ multithreading sockets python-2.7

我正在编写一个守护进程,我必须在 Java 和 Python 之间做出选择 - 从技术上讲,我完全负责语言选择,但我将范围缩小到这两种。我选择 Python 2.7 是因为我对它有很长的历史。我 100% 确定我不想使用任何其他语言。可能会考虑为 Python 3 重写它,但这是我愿意做的。服务器仍处于设计阶段,因此为 Python 3 重写它并不昂贵,但 C++、Java 或任何其他语言都是不可能的。现在,我知道如何编写并发服务器,但我的问题是:

"Is there a better solution?"

一般来说,主线程会等待新连接,如果有连接,它会生成一个新线程来处理客户端并监听新连接。

# pseudo-code
import threading, socket

class thread(threading.Thread):
    def __init__(self, socket):
        self.socket = socket
    def run(self):
        deal_with_client()

while True:
    s, fromaddr = sock.accept()
    t = thread(s)
    t.start()

我在考虑多处理而不是线程,但我不确定这是正确的方法。我的服务器有可能同时接触到数千个客户端。硬件不是问题,我们考虑到一个事实,即 python 守护进程比编写良好的 C++ 守护进程需要更多。谁有更好的主意?

第二个问题:

"Is Python 3 faster than equivalent Python 2.7?"

预先感谢您的回答/建议/意见/其他。

最佳答案

这取决于您将为每个客户完成的工作。许多服务器不会为每个客户端请求做大量的 CPU 密集型工作,在这种情况下最好使用像 Python Twisted 这样的事件驱动模型。在 Python 中尤其如此,因为线程不是它的强项。

如果您有很多 CPU 密集型工作要做,您应该使用线程池(不是每个请求线程或每个客户端线程,而是每个核心线程)。然后你可以用 C 或 C++ 或其他语言实现 CPU 密集型部分,并避免在此期间持有 GIL。这将使您能够使用 Python 释放多核的力量。

最后,不,Python 3 不太可能比 2.7 快。

关于python - 提升 python 服务器的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25988223/

相关文章:

python - 将文件从 cp1251 转换为 utf8

python - 如何根据 Pandas 中的列进行 "unfold"行

python - API 自动化的并行执行

c++ - 使用 find 方法后如何更新 std::map ?

c++ - 返回是原子的,我应该在 getter 中使用临时的线程安全吗?

python - xbbg 的 BBG_ROOT(简化的 blpapi 包)

c++ - 如何在 SFML 中制作一致的点击/相交/包含方法?

c++ - 我需要一个类似于堆栈但具有随机访问功能的数据结构,但是我应该实现什么?

c++ - 在 Windows C++ 服务中阻止两个线程

java - Android Studio Java ANR 内存泄漏