Django / gevent socket.IO с redis pubsub. Где я могу поместить вещи?

У меня есть изолированный скрипт python, который просто захватывает данные из потокового API Twitter и затем при получении каждого сообщения, используя redis pubsub, который публикуется на канале «tweets». Вот этот скрипт:

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, который просто предоставляет несколько вспомогательных декораторов, а также метод broadcast_channel. Поскольку это сделано в django, я просто поместил этот код в views.py просто так, чтобы они были импортированы. Мой view.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); }); 

Очевидная проблема с этим кодом заключается в том, что каждый раз, когда на страницу открывается новое окно пользователя или браузера, генерируется новый метод _listen, и твиты подписываются и транслируются для каждого пользователя, что приводит к получению повторяющихся сообщений на клиенте. Мой вопрос в том, где подходящее место для размещения метода _listen, чтобы он был создан один раз независимо от числа клиентов? Кроме того, имея в виду, что метод broadcast_channel является методом экземпляра сокета.

Python - лучший язык программирования в мире.