Ich spiele mit gevent und websockets. Dies ist ein einfaches Echo-Server:warum ist gevent-websocket synchron?
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()
und der Kunde:
<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>
Wegen gevent
Ich erwartete mehrere greenlets haben die Daten dienen asynchron; Das heißt, wenn ich einige Daten mehrmals in den Websocket schob (schnell auf den Push-Button klickend), erwartete ich, dass ich nach 5 Sekunden Wartezeit alles gleichzeitig zurück hatte.
Doch egal, wie schnell ich die Push-Button klicken, ist das, was ich in der Konsole:
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"
warum es synchron meine Daten empfangen, alle 5 Sekunden eine Pause? Wie verwandele ich es in einen asynchronen Server?
Fällt Affe-Patching mit Gevent nicht "magisch synchronen Code in asynchronen Code verwandeln"? – FullStack
Nur wenn Sie mehrere Greenlets und Verbindungen haben. Wenn sich der Code auf einzelne Verbindungen von einem einzelnen Greenlet bezieht, wird der Koroutinenmechanismus von gevent nicht helfen.Mit anderen Worten, Magie passiert nur, wenn du daran glaubst, und strukturiere deinen Code entsprechend ;-) –