Tôi đang chơi với gevent và websockets. Đây là một máy chủ đơn giản vang:tại sao gevent-websocket đồng bộ?
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()
và khách hàng:
<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>
Do gevent
Tôi đã hy vọng có một vài greenlets phục vụ dữ liệu không đồng bộ; đó là, nếu tôi đã đẩy một số dữ liệu vào websocket vài lần (nhanh chóng bấm vào nút Push), tôi đã mong đợi để có nó tất cả trở lại đồng thời sau 5 giây chờ đợi.
Tuy nhiên, không có vấn đề nhanh như thế nào tôi bấm nút Push, đây là những gì tôi nhận được trong giao diện điều khiển:
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"
tại sao nó nhận được dữ liệu của tôi đồng bộ, tạm dừng mỗi 5 giây? Làm thế nào để biến nó thành một máy chủ không đồng bộ?
Khỉ có gắn gevent không "biến đổi mã đồng bộ một cách kỳ diệu thành mã không đồng bộ" không? – FullStack
Chỉ khi bạn có nhiều greenlet và kết nối. Nếu mã được giao dịch với một kết nối duy nhất từ một greenlet đơn, cơ chế coroutine của gevent sẽ không giúp ích gì.Nói cách khác, phép thuật chỉ xảy ra khi bạn tin vào nó, và cấu trúc mã của bạn cho phù hợp ;-) –