Als ich darüber nachdachte, Daten zwischen Ruby und Python Daemon mithilfe von Redis (Pub / Sub) [^ Streams] zu übertragen, hörte ich eine himmlische Stimme, die sagte, dass es einfacher wäre, die Kommunikation zwischen Prozessen (POSIX IPC) zu verwenden, also versuchte ich es. Ich versuchte es.
Da es diesmal auf dem Himbeer-Pi ausgeführt wird, erwägen wir außerdem eine Strategie, um die Anzahl der Prozesse aufgrund von Stromversorgungsproblemen so weit wie möglich zu reduzieren.
[^ Streams]: Ab redis5 gibt es eine zusätzliche Funktion namens Streams, die zuverlässiger ist als die Pub / Sub-Funktion.
Eine der prozessübergreifenden Kommunikationen, die über die Systemaufruf- / Bibliotheksfunktion von POSIX verwendet werden können. Asynchrones Kommunikationsprotokoll, wie eine stark vereinfachte Version von Messaging-Middleware wie Rabbit MQ, ohne Angst vor Missverständnissen. Da es POSIX-kompatibel ist, kann es problemlos mit einer einfachen API verwendet werden.
Weitere Informationen finden Sie im Folgenden.
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/mq_overview.7.html
Es ist egal, welches gesendet / empfangen wird, aber diesmal habe ich Ruby als Absender ausprobiert. Ich habe posix-mqueue als Bibliothek verwendet. Sehr einfach.
require 'posix/mqueue'
require 'json'
def main
m = POSIX::Mqueue.new("/whatever", msgsize: 8192, maxmsg: 10)
10.times do |i|
m.send({ messsage: "hello python world #{i}" }.to_json)
sleep 1
end
m.send ({ message: 'end'}.to_json)
ensure
m.unlink if m
end
if __FILE__ == $PROGRAM_NAME
main
end
Das ist auch schrecklich einfach. Die verwendete Bibliothek ist posix_ipc
# -*- coding: utf-8 -*-
import time
import posix_ipc
import json
def main () :
mq = posix_ipc.MessageQueue("/whatever", posix_ipc.O_CREAT)
while True:
data = mq.receive()
j = json.loads(data[0]) # -> (message, priority)Komm mit einem Taple zurück
print j
if j.get('message') == "end":
break
if __name__ == "__main__" :
main()
Es wurde wie erwartet auf der Python-Seite ausgegeben!
$ python main.py
{u'messsage': u'hello python world 0'}
{u'messsage': u'hello python world 1'}
{u'messsage': u'hello python world 2'}
{u'messsage': u'hello python world 3'}
{u'messsage': u'hello python world 4'}
{u'messsage': u'hello python world 5'}
{u'messsage': u'hello python world 6'}
{u'messsage': u'hello python world 7'}
{u'messsage': u'hello python world 8'}
{u'messsage': u'hello python world 9'}
{u'message': u'end'}
Es ist eine einfache Quelle, aber ich habe sie auf Github gepostet. https://github.com/y-amadatsu/posix-mq-with-raspberry-pi-os
Wenn Sie eine POSIX-Nachricht verwenden, wird die Nachrichtenwarteschlange übrigens unter "/ dev / mqueue" angezeigt. Es kann auch mit "ls" oder "rm" montiert und betrieben werden. Dieser Bereich ist sehr UNIX! Es fühlt sich an wie: entspannt:
cat /dev/mqueue/whatever
QSIZE:350 NOTIFY:0 SIGNO:0 NOTIFY_PID:0
Recommended Posts