我有以下设置:
运行在使用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}})
“阻塞行为”的原因是websocket.pyws4py包的文件。在
您可以编辑类WebSocketManager
的broadcast()
函数(经理.py)记录异常。在
但我仍然不知道为什么这个例子会产生那些超时。我注意到的一点是,当使用线程客户端WebSocketClient
而不是WebSocketBaseClient
时,问题似乎不会发生。在
目前没有回答
相关问题 更多 >
编程相关推荐