【问题标题】:Non Blocking Server in PythonPython中的非阻塞服务器
【发布时间】:2009-10-04 05:35:02
【问题描述】:

谁能告诉我如何单独使用套接字库编写非阻塞服务器代码。谢谢

【问题讨论】:

    标签: python sockets nonblocking


    【解决方案1】:

    坦率地说,只是不要(除非是为了锻炼)。 Twisted Framework 将为您完成所有与网络相关的事情,因此您只需编写协议而不关心传输层。编写套接字代码并不容易,所以为什么不使用其他人编写和测试的代码。

    【讨论】:

    • 确实使用了twisted,我曾经自己写过一个基于事件的socket库,这很痛苦......即使是简单的事情,比如检查连接是否被客户端关闭或错误都可以得到你有很多麻烦。如果您想深入了解套接字的工作原理,这绝对是值得的,但这需要大量的试验和错误。
    【解决方案2】:

    为什么要单独使用socket?使用另一个标准库模块asyncore如此要简单得多——如果你不能,至少 非常select

    如果你受限于你的作业条件只能使用socket,那么我希望你至少可以添加threading(或multiprocessing),否则你认真幸运——您可以使用timeout 制作套接字,但是在没有任何其他明显标准库模块(支持异步线程服务)所需帮助的情况下处理超时套接字是一种确实是一团糟-y...;-)。

    【讨论】:

      【解决方案3】:

      不确定“单独的套接字库”是什么意思 - 你肯定需要标准 Python 库中的其他模块。

      最低级别的非阻塞代码是select module。这允许您同时拥有许多客户端连接,并报告其中哪些有待处理的输入。因此,您选择服务器(接受)套接字,以及您已经接受的任何客户端连接。其上的薄层是 asyncore 模块。

      【讨论】:

        【解决方案4】:

        使用 eventlet 或 gevent。它猴子修补现有的库。 socket 模块无需任何更改即可使用。虽然代码看起来是同步的,但它是异步执行的。

        示例: http://eventlet.net/doc/examples.html#socket-connect

        【讨论】: