我有一个独立的python脚本,它只是从Twitter的流式API捕获数据,然后在收到每条消息时,使用它发布到“tweets”频道的redis pubsub。这是剧本:
def main():
username = "username"
password = "password"
track_list = ["apple", "microsoft", "google"]
with tweetstream.FilterStream(username, password, track=track_list) as stream:
for tweet in stream:
text = tweet["text"]
user = tweet["user"]["screen_name"]
message = {"text": text, "user": user}
db.publish("tweets", message)
if __name__ == '__main__':
try:
print "Started..."
main()
except KeyboardInterrupt:
print '\nGoodbye!'
我的服务器端socket.io实现是使用django socketio(基于gevent socketio)https://github.com/stephenmcd/django-socketio完成的,它只提供一些助手装饰器和广播通道方法。因为这是在django中完成的,所以我将这段代码简单地放在views.py中,以便导入它们。My views.py代码:
def index(request):
return render_to_response("twitter_app/index.html", {
}, context_instance=RequestContext(request))
def _listen(socket):
db = redis.Redis(host="localhost", port=6379, db=0)
client = db.pubsub()
client.subscribe("tweets")
tweets = client.listen()
while True:
tweet = tweets.next()
tweet_data = ast.literal_eval(tweet["data"])
message = {"text": tweet_data["text"], "user": tweet_data["user"], "type": "tweet"}
socket.broadcast_channel(message)
@on_subscribe(channel="livestream")
def subscribe(request, socket, context, channel):
g = Greenlet.spawn(_listen, socket)
客户端socket.io JavaScript只需连接和订阅频道“livestream”,并捕获该频道接收到的任何消息:
var socket = new io.Socket();
socket.connect();
socket.on('connect', function() {
socket.subscribe("livestream");
});
socket.on('message', function(data) {
console.log(data);
});
此代码的明显问题是,每次打开新用户或浏览器窗口时,都会生成一个新的侦听方法,并为每个用户订阅和广播tweets,从而在客户端上接收到重复的消息。我的问题是,应该把“倾听”方法放在哪里,以便它只创建一次,而不管客户是谁?另外,请记住广播频道方法是套接字实例的方法。
最佳答案
问题是,当我应该使用socket.send时,我正在使用socket.broadcast_频道。
关于python - 带有redis pubsub的Django/gevent socket.IO。我在哪里放东西?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7678402/