Gram w gevent i websockets. Jest to prosty serwer echo:dlaczego gevent-websocket jest synchroniczny?
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()
a klient:
<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>
powodu gevent
Spodziewałem się mieć kilka greenlets obsługujących dane asynchronicznie; to znaczy, gdy kilka razy popchnąłem dane do websocket (szybko klikając na przycisk Push), spodziewałem się, że wszystkie dane zostaną zwrócone jednocześnie po 5 sekundach oczekiwania.
Jednak bez względu na to, jak szybko kliknięciu przycisku, to co mam w konsoli:
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"
dlaczego odbierać moich danych synchronicznie, zatrzymując się co 5 sekund? Jak przekształcić go w serwer asynchroniczny?
Czy łatanie małp z geventami nie "magicznie przekształca kod synchroniczny w kod asynchroniczny"? – FullStack
Tylko jeśli masz wiele zielonych i połączeń. Jeśli kod ma do czynienia z pojedynczymi połączeniami z pojedynczej greenletu, mechanizm coroutine gevent nie pomoże.Innymi słowy, magia dzieje się tylko wtedy, gdy w nią wierzysz, i odpowiednio ustrukturyzuj swój kod ;-) –