【问题标题】:Python Server Socket Without Infinite Loop?没有无限循环的 Python 服务器套接字?
【发布时间】:2013-12-27 11:57:46
【问题描述】:

我想创建一个允许在同一端口上发送和接收的类,并在程序执行操作时根据传入消息创建一个事件驱动的应用程序。我对套接字没有太多经验,所以我不知道该怎么做。这是我的 SimpleSock 类,到目前为止只是绑定了套接字。我还在那里放置了一个无限循环来监听连接,但我知道这对我想要的不起作用,因为除了监听之外程序将无法做任何事情。

import socket

class SimpleSock:

    def __init__(self, ip=None, port=None):
        if ip == None or port == None:
            print("SimpleSock cannot init without an ip and port")
        else:
            self.ip = ip
            self.port = port
            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            print("attempting connection to " + self.ip + " on port " + str(self.port))

            self.socket.bind((self.ip, self.port))
            self.socket.listen(5)

            print("connected")

            while True:
                (clientsocket, address) = self.socket.accept()
                #do something

如何在没有无限循环的情况下编写监听?我需要使用线程吗?

【问题讨论】:

  • 是的,如果您的程序需要做的不仅仅是侦听套接字或想要同时处理大量客户端连接,线程将是一个好主意。您还可以使用进程(谷歌 python 多处理)而不是线程。

标签: python multithreading sockets


【解决方案1】:

可以使用 Python Twisted 或 Tornado 等框架构建 Python 中的事件驱动网络应用程序。您可以在此处查看另一个问题的比较:When to use Tornado, when to use Twisted / Cyclone / GEvent / other

一般的想法是,框架将允许您在事件发生时注册回调,例如数据在套接字上等待,并且框架通常是您的“主循环”(因此它通常会接管对主线程的控制)。大多数时候你不需要线程——只要你的所有事件源都可以使用 select() 或类似方法等待,所有东西都可以在一个线程中多路复用。

【讨论】:

    最近更新 更多