2013-11-13 3 views
2

Я пытаюсь установить связь между приложением node.js и python с помощью socket.io с библиотекой socketIO-client 0.5.1 на стороне python. Ниже приведены два кода куски:socketIO-client - RuntimeError: превышена максимальная глубина рекурсии

var http = require('http').createServer(); 
http.listen(6000); 
var io = require('socket.io').listen(http, { log: false }); 
var events = require('events'); 
var eventEmitter = new events.EventEmitter(); 
    var counter = 0; 
    io.sockets.on('connection', function (socket) { 
     eventEmitter.on('observe', function(message){ 
      socket.emit('sendVoltage', {}); 
     }); 

     socket.on('voltage', function (data) { 
      console.log(counter + " - " + data.voltage); 
      if (counter++ < 500) { 
       eventEmitter.emit('observe', ''); 
      } 
     }); 
     eventEmitter.emit('observe', ''); 
    }); 

#!/usr/bin/python 
import time, signal, sys 
from Adafruit_ADS1x15 import ADS1x15 
from socketIO_client import SocketIO 
ADS1115 = 0x01 # 16-bit ADC 
adc = ADS1x15(ic=ADS1115) 
socketIO = SocketIO('chair01', 6000) 
def on_voltage_response(*args): 
    print 'on_voltage_response', args 

def on_sendVoltage(*args): 
    voltage = adc.readADCSingleEnded(0, 4096, 250)/1000 
    print "Emitting voltage" 
    socketIO.emit('voltage', {'voltage': voltage}, on_voltage_response) 
    socketIO.wait_for_callbacks(seconds=1) 
    print "Voltage emitted" 

socketIO.on('sendVoltage', on_sendVoltage) 
socketIO.wait(seconds=1) 

При обнаружении sendVoltage сообщение функция on_sendVoltage выполняется, то сообщение напряжения испускается, но контроль никогда не возвращается из Emit. Появляется следующее сообщение, а следующее и т. Д. Никогда не возвращается. В какой-то момент он умирает со слишком большим количеством рекурсивных вызовов.

Что я делаю неправильно?

ответ

0

Вы вызываете socketIO.wait_for_callbacks() в функции on_sendVoltage. Ваш главный должен быть вместо этого что-то вроде этого:

state = 'waiting' 
while state == 'waiting': 
    self.socket.wait(seconds=1) 

Это будет держать Python работает ждать вечно, но ваши обратные вызовы все равно будет работать. Вы можете изменить состояние в своих обратных вызовах, если хотите сделать что-то еще.

Смежные вопросы