简单的websocket服务器在Python上使用time.sleep



time.sleep(1)sendMessage之前使用时,hole进程停止(甚至其他连接)

def handleConnected(self): print self.address, 'connected' for client in clients: time.sleep(1) client.sendMessage(self.address[0] + u' - connected')

服务器:https://github.com/dpallot/simple-websocket-server

如何解决?

您正在使用的服务器是同步的,"select"类型的服务器。这些服务器使用单个进程和单个线程,它们通过使用select()函数来实现并发,从而有效地等待多个套接字连接上的I/O。

选择服务器的优点是它们可以很容易地扩展到非常多的客户端。缺点是,当服务器调用应用程序处理程序(此服务器的handleConnected()handleMessage()handleClose()方法)时,服务器阻塞,这意味着当处理程序运行时,服务器被挂起,因为处理程序和服务器都运行在同一个线程上。在这种类型的体系结构中,服务器响应的唯一方法是对处理程序进行编码,使它们能够快速完成需要做的事情,并将控制权返回给服务器。

您的handleConnected处理程序函数不适合这种类型的服务器,因为它是一个长时间运行的函数。这个函数将运行几秒钟(有多少客户端就运行多少秒),所以在这段时间内服务器将被阻塞。

你可以通过为你的长时间运行任务创建一个后台线程来解决这个服务器的限制。这样处理程序就可以在启动线程后返回到服务器。然后服务器将重新获得控制权并继续工作,而后台线程则在内部休眠一秒钟。唯一需要考虑的问题是,现在你有了一个自产的多线程服务器,所以你将无法轻松地进行扩展。

您可以考虑的另一个选项是使用不同的服务器体系结构。例如,基于协程的服务器将在您编写处理程序函数时支持它。我在这个类别中推荐的两个服务器是eventlet和gevent。eventlet服务器自带原生WebSocket支持。对于gevent,你必须安装一个名为geevent -websocket的扩展。

祝你好运!

您正在使用sleep暂停线程,并且您正在使用的服务器似乎正在使用select来处理请求而不是线程。因此,没有其他请求将能够被处理。

所以你不能使用time.sleep

你为什么需要睡觉?你能用别的方法解决吗?

也许你可以使用threading.Timer()

def sendHello(client):
    client.sendMessage("hello, world")
for client in clients:
    t = Timer(1.0, lambda: sendHello(client))
    t.start() # after 30 seconds, "hello, world" will be printed

这是我突然想到的。你还需要一种方法来取消每个计时器,所以我猜你需要保存每个t在一个列表中,并调用它时完成。

相关内容

  • 没有找到相关文章

最新更新