2013-04-22 1 views
2

У меня есть этот простой скрипт, питона, который подключается к питанию ZMQ и выплевывает некоторые данные:переподключения к ZMQ корма после отключения

#!/usr/bin/env python2 
import zlib 
import zmq 
import simplejson 

def main(): 
    context = zmq.Context() 
    subscriber = context.socket(zmq.SUB) 

    # Connect to the first publicly available relay. 
    subscriber.connect('tcp://relay-us-east-1.eve-emdr.com:8050') 
    # Disable filtering. 
    subscriber.setsockopt(zmq.SUBSCRIBE, "") 

    while True: 
     # Receive raw market JSON strings. 
     market_json = zlib.decompress(subscriber.recv()) 
     # Un-serialize the JSON data to a Python dict. 
     market_data = simplejson.loads(market_json) 
     # Dump typeID 
     results = rowsets = market_data.get('rowsets')[0]; 
     print results['typeID'] 

if __name__ == '__main__': 
    main() 

Это работает на моем домашнем сервере. Иногда мой домашний сервер теряет связь с Интернетом, проклинание жилого подключения. Однако, когда сеть выходит и возвращается, сценарий останавливается. Есть ли способ повторно инициализировать соединение? Я все еще новичок в python, точка в правильном направлении была бы замечательной. =)

+0

Динамический DNS? ZeroMQ будет решать только один раз, который может быть вашей проблемой. –

+0

Я использую динамический DNS, да. У меня есть .it.cx имя хоста, указывающее на мой IP-адрес, который регулярно обновляется на моем маршрутизаторе. Если есть способ, которым я могу проверить через цикл, если есть соединение, и если не попробовать повторно подключиться? – Ryan

+0

Вы должны периодически закрывать и повторно подключаться, чтобы повторно разрешить запись DNS. –

ответ

1

Не уверен, что это по-прежнему актуальна, но здесь идет:

Используйте тайм-аут (примеры here, here и here). На ZMQ < 3.0 это будет выглядеть примерно так (не проверено):

#!/usr/bin/env python2 
import zlib 
import zmq 
import simplejson 

def main(): 
    context = zmq.Context() 
    while True: 
     subscriber = context.socket(zmq.SUB) 
     # Connect to the first publicly available relay. 
     subscriber.connect('tcp://relay-us-east-1.eve-emdr.com:8050') 
     # Disable filtering. 
     subscriber.setsockopt(zmq.SUBSCRIBE, "") 
     this_call_blocks_until_timeout = recv_or_timeout(subscriber, 60000) 
     print 'Timeout' 
     subscriber.close() 

def recv_or_timeout(subscriber, timeout_ms) 
    poller = zmq.Poller() 
    poller.register(subscriber, zmq.POLLIN) 
    while True: 
     socket = dict(self._poller.poll(stimeout_ms)) 
     if socket.get(subscriber) == zmq.POLLIN: 
      # Receive raw market JSON strings. 
      market_json = zlib.decompress(subscriber.recv()) 
      # Un-serialize the JSON data to a Python dict. 
      market_data = simplejson.loads(market_json) 
      # Dump typeID 
      results = rowsets = market_data.get('rowsets')[0]; 
      print results['typeID'] 
     else: 
      # Timeout! 
      return 

if __name__ == '__main__': 
    main() 

ZMQ> 3,0 позволяет установить RCVTIMEO опцию сокета, который заставит его recv() поднять ошибку таймаута, без необходимости в Poller объект.