2013-11-24 106 views
2
import redis 
import threading 

class Listener(threading.Thread): 
    def __init__(self, r, channel): 
     threading.Thread.__init__(self) 
     self.redis = r 
     self.pubsub = self.redis.pubsub() 
     self.pubsub.subscribe(channel) 

def run(self): 
    for item in self.pubsub.listen(): 
     # do stuff 
     pass 

在上面的代碼我怎麼停止線程?蟒蛇redis pubsub阻止

下面我有一個示例代碼來告訴你我想什麼:

class Listener(threading.Thread): 
    def __init__(self, r, channel): 
     threading.Thread.__init__(self) 
     self.redis = r 
     self.pubsub = self.redis.pubsub() 
     self.pubsub.subscribe(channel) 
     self.stop = False 

    def run(self): 
     while not stop: 
      # get item from channel 

所以當屬性停止==真該線程將退出循環,並結束。 這可能嗎?如果不是什麼選擇?

+0

這裏是ioloop終止無阻塞例如一旦已收到消息 - https://github.com /abhinavsingh/async_pubsub/blob/master/examples/redis_subscribe.py#L27 –

回答

3

有一個有用的要點,顯示如何傳遞一個命令,將打破循環和取消訂閱。看看你如何以其他方式做到這一點很有用。

for item in self.pubsub.listen(): 
    if item['data'] == "KILL": 
     self.pubsub.unsubscribe() 
     print self, "unsubscribed and finished" 
     break 
    else: 
     self.work(item) 

你可以看到的例子代碼在這裏: