Vielleicht hat hier ja irgendjemand ein bisschen mehr Ahnung von Python als ich – vermutlich nicht sonderlich schwer – und kann mir daher erklären, wieso das erste Skript nicht funktioniert, das Zweite hingegen schon. Biteule und ich sind nur soweit gekommen, dass es wohl irgendwas mit dem Threading der GPIO-Callbacks zu tun haben muss aber was jetzt genau das Problem ist, verstehen wir beide nicht. Es ist nicht so, dass zerorpc im ersten Skript beim Aufruf nicht vorhanden ist, immerhin kann es einen Fehler ausgeben (LostRemote: Lost remote after 10s heartbeat), wieso also macht es trotzdem einen Unterschied, an welcher Stelle ich es importiere?
import RPi.GPIO as GPIO import time import zerorpc nodebridge = zerorpc.Client() nodebridge.connect("tcp://127.0.0.1:4242") GPIO.setmode(GPIO.BCM) GPIO.setup(27, GPIO.IN) def switchview(switchview_taster): nodebridge.switchview() try: GPIO.add_event_detect(27, GPIO.FALLING, callback=switchview, bouncetime=600) while 1: time.sleep(100)
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(27, GPIO.IN) def switchview(switchview_taster): import zerorpc nodebridge = zerorpc.Client() nodebridge.connect("tcp://127.0.0.1:4242") nodebridge.switchview() try: GPIO.add_event_detect(27, GPIO.FALLING, callback=switchview, bouncetime=600) while 1: time.sleep(100)
var io = require('socket.io').listen(1234); var zerorpc = require("zerorpc"); var pythonbridge = new zerorpc.Server({ switchview: function(reply) { io.sockets.emit('switchview'); reply(null); } }); pythonbridge.on("error", function(error) { console.error("RPC server error:", error); }); pythonbridge.bind("tcp://0.0.0.0:4242");
UPDATE 12.02.15 – 14:51:
@paviro_ eure Vermutung wird stimmen, kurzes googeln hat das hier gebracht: https://t.co/DBzWoEZI7p => „ZeroRPC itself is not thread safe“
— bytesnake (@bytesnake) 11. Februar 2015
@paviro_ mh zerorpc scheint ein wrapper um zeromq zu sein, da zeromq in C geschrieben wurde ist dieser Teil von zerorpc nicht thread safe — bytesnake (@bytesnake) 11. Februar 2015
@paviro_ das scheint aber ein generelles problem von ZMQ zu sein => „In ØMQ, Contexts are threadsafe objects, but Sockets are not.“
— bytesnake (@bytesnake) 11. Februar 2015