为什么这个ws4py/CherryPy示例会在一段时间后阻塞消息?

2024-06-26 03:59:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下设置:

运行在使用python3.4的linuxx64下的CherryPy-10.2.1webserver带有ws4py-0.4.2广播处理程序,它将打印接收到的消息(包含时间戳)和该消息的运行时。在

然后有60个客户机线程(我也使用了10个、20个、50个和70个具有类似结果的线程)将使用ws4py连接到服务器。他们每0.1秒发送一次时间戳消息。在

在服务器日志文件中大约48500行之后,消息将在10秒间隔后到达。但是客户端线程继续以原始速度发送。消息似乎被发送,得到缓冲,只有10秒后才被释放。在

如果我终止客户机线程,消息不会丢失,但是所有被阻止的消息都会被释放并出现在广播处理程序中(根据线程运行的时间长短而定)。如果让客户端线程发送那么长的时间,可能需要15分钟。)

如果我关闭客户机的sock,并在850次发送(即51000条消息之后)后再次连接,消息首先会被阻止,但由于重新连接,这些消息很快就会被“刷新”,并且消息会出现在服务器日志中。在

这些消息在哪里被阻止?ws4py send()函数正在使用socket.sendall(),此发送是否有问题?或者消息在服务器端被阻塞了(因为如果我杀死客户机,消息仍然会被传递)?在

有人知道这种信息屏蔽吗?在

服务器:

# ws4py
from ws4py.server.cherrypyserver import WebSocketPlugin, WebSocketTool
from ws4py.websocket import WebSocket
from ws4py import configure_logger

# general
import cherrypy
import logging
import datetime
import json

# settings
host_ip = '127.0.0.1'
host_port = 20000
filepath = '/path/to/server.log'
loglevel = logging.INFO

# logger
logger = configure_logger(stdout=True, filepath=filepath, level=loglevel)

# cherrypy
cherrypy.config.update({'server.socket_host': host_ip,'server.socket_port': host_port})
WebSocketPlugin(cherrypy.engine).subscribe()
cherrypy.tools.websocket = WebSocketTool()


class BroadcastWebSocketHandler(WebSocket):

    def opened(self):
        logger.info("BroadcastWebSocketHandler - opened")

    def received_message(self, message):
        msg = {}
        try:
            msg = json.loads(str(message))
        except Exception as e:
            logger.critical(repr(e))

        if 'timestamp' in msg:
            format_str = '%Y-%m-%d %H:%M:%S.%f'
            dt_now = datetime.datetime.utcnow()
            dt = datetime.datetime.strptime(msg['timestamp'], format_str)
            delta = dt_now - dt
            logger.info("BroadcastWebSocketHandler - received message: {} - runtime: {}".format(str(message), str(delta)))
        else:
            logger.info("BroadcastWebSocketHandler - received message: {}".format(str(message)))

        cherrypy.engine.publish('websocket-broadcast', str(message))


class Root(object):

    @cherrypy.expose
    def index(self):
        return 'Text.'

    @cherrypy.expose
    def ws(self):
        handler = cherrypy.request.ws_handler


if __name__ == '__main__':
    cherrypy.quickstart(Root(), '/', config={'/ws': {'tools.websocket.on': True,
                                                     'tools.websocket.handler_cls': BroadcastWebSocketHandler}})

客户:

^{pr2}$

更新日期:2018年2月7日:

“阻塞行为”的原因是websocket.pyws4py包的文件。在

您可以编辑类WebSocketManagerbroadcast()函数(经理.py)记录异常。在

但我仍然不知道为什么这个例子会产生那些超时。我注意到的一点是,当使用线程客户端WebSocketClient而不是WebSocketBaseClient时,问题似乎不会发生。在


Tags: import服务器host消息messagedatetime客户机时间