我正在尝试使用python的pub/sub模式。我在客户端面临着一个奇怪的问题。在客户端,我使用pyzmq、和side作为wsgi服务器。虽然它对一个客户端非常有效,但其他客户机正在等待第一个客户端断开连接。在使用一个客户端时,如果我断开和重新连接,我将为每个重新连接获取两次或两次以上的消息。
#!/usr/bin/python
from gevent import monkey; monkey.patch_all()
import zmq
import gevent
from bottle import route, run, request, abort, Bottle ,static_file
from gevent import sleep
from gevent.pywsgi import WSGIServer
import geventwebsocket
from geventwebsocket import WebSocketHandler, WebSocketError
host = "127.0.0.1"
port = 8000
mqport = "8082"
context = zmq.Context()
socket = context.socket(zmq.SUB)
app = Bottle()
@app.route('/v1/streams/device/<id>')
def handle_websocket(id):
socket.setsockopt(zmq.UNSUBSCRIBE, '')
socket.connect ("tcp://localhost:%s" % mqport)
socket.setsockopt(zmq.SUBSCRIBE, id)
wsock = request.environ.get('wsgi.websocket')
if wsock is None:
logger.info("Error creating websocket")
try :
while True:
string = socket.recv()
logger.info("%s" % string)
id, data = string.split(" ")
wsock.send("%s" % data)
sleep(0.1)
except geventwebsocket.WebSocketError, ex:
wsock.close()
sock.close()
server = WSGIServer((host, port), app,
handler_class=WebSocketHandler)
server.serve_forever()我看到的所有示例都使用while循环来接收消息。我对这个while循环感到不舒服,并寻找一些像socket.on_message这样的回调函数。为了实验目的,我编写了一个node.js版本的相同的,没有像这样的while循环,但在我的项目节点被排除在外。节点版本在这里:
var WebSocketServer = require('websocket').server;
var http = require('http');
global.client = 0;
var server = http.createServer(function(request, response) {
});
server.listen(8000, function() { });
wsServer = new WebSocketServer({
httpServer: server
});
// WebSocket server
wsServer.on('request', function(request) {
console.log("connected client :", global.client++)
var connection = request.accept(null, request.origin);
var url = request.resourceURL.href
var device_id = url.substr(url.lastIndexOf('/') + 1)
var zeromq = require('zmq');
var sock = zeromq.socket('sub');
sock.connect('tcp://127.0.0.1:8082');
sock.subscribe(device_id);
sock.on('message', function(data) {
console.log(data.toString());
var msg = data.toString();
var rjson = msg.split(" ")
connection.send(rjson.pop());
});
connection.on('close', function(connection) {
});
});这里我不使用while循环。
我的python代码做错了什么?
发布于 2013-11-16 14:14:07
几天后,我们发现了一个非阻塞的zeromq客户端,名为。
教训是,与zmq客户端一起使用的人不要使用pyzmq,而是使用gevent。
现在与pyzmq合并。做import zmq do from zmq.green import zmq的整数
https://stackoverflow.com/questions/19884200
复制相似问题