为什么geventwebsocket是同步的?

2024-06-16 07:55:45 发布

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

我在玩gevent和websockets。这是一个简单的echo服务器:

from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from gevent import sleep
from datetime import datetime
def app(environ, start_response):
    ws = environ['wsgi.websocket']
    while True:
        data = ws.receive()
        print('{} got data "{}"'.format(
            datetime.now().strftime('%H:%M:%S'), data))
        sleep(5)
        ws.send(data)

server = WSGIServer(("", 10004), app,
    handler_class=WebSocketHandler)
server.serve_forever()

客户:

<html>
    <body>
        <button type="button" id="push_data">Push</button>
    </body>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.js"></script>
    <script>
        var ws = new WebSocket("ws://localhost:10004");
        ws.onmessage = function(evt) {
            console.log(evt)
        };
        $('#push_data').click(function(){
            console.log('sending data...');
            ws.send('sample data');
        });
    </script>
</html>

因为gevent我希望有几个greenlet异步地为数据提供服务;也就是说,如果我多次将某些数据推送到websocket(快速单击按钮),我希望在等待5秒后,所有数据都能同时返回。

然而,无论我多么快速地点击按钮,这就是我在控制台中得到的:

18:28:07 got data "sample data"
18:28:12 got data "sample data"
18:28:17 got data "sample data"
18:28:22 got data "sample data"
18:28:27 got data "sample data"

为什么它会同步接收我的数据,每5秒暂停一次?如何将其转换为异步服务器?


Tags: 数据samplefromimport服务器datadatetimews