Prozessübergreifende Kommunikation zwischen Ruby und Python (POSIX-Nachrichtenwarteschlange)

Überblick

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.

Was ist eine POSIX-Nachrichtenwarteschlange?

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

Das ganze System

Ruby-seitige Implementierung (Absenderseite)

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

Python-seitige Implementierung (Empfängerseite)

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()

Ergebnis

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

Beiseite

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

Prozessübergreifende Kommunikation zwischen Ruby und Python (POSIX-Nachrichtenwarteschlange)
Unterschiede zwischen Ruby und Python im Umfang
Unterschied zwischen Ruby und Python (grundlegende Syntax)
Ruby, Python und Map
[Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask
Steuern Sie andere Programme von Python aus (Kommunikation zwischen Python ⇔ exe)
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Python auf Ruby und wütend Ruby auf Python
Python und Ruby Slice Memo
Ruby- und Python-Syntax ~ branch ~
Stapel und Warteschlange in Python
Unterschied zwischen Java und Python (Memo)
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Scraping mit Node, Ruby und Python
Behandeln Sie Posix-Nachrichtenwarteschlangen in Python
Zusammenarbeit zwischen Python-Modul und API
Unterschied zwischen Python, Stftime und Strptime
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
[Python] Unterschied zwischen Funktion und Methode
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Socket-Kommunikation und Multithread-Verarbeitung durch Python
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Warteschlangen- und Python-Implementierungsmodul "deque"
Unterschiede zwischen Python- und Java-Syntax
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
[Grundlegende Grammatik] Unterschiede zwischen Ruby / Python / PHP
[Python] Unterschied zwischen Klassenmethode und statischer Methode
[Python3] Wechseln Sie zwischen Shift_JIS, UTF-8 und ASCII
[Python Iroha] Unterschied zwischen Liste und Tupel
Mit Ruby (Rails) verschlüsseln und mit Python entschlüsseln
[Python] Unterschied zwischen Rand- und Randn-Ausgabe
Unterschiede in der Multithread-Verarbeitung zwischen Python und Jython
Einfaches Web-Scraping mit Python und Ruby
Korrespondenz zwischen den in Python integrierten Funktionen und Rust
Kommunikation verschlüsselter Daten zwischen Python und C #
Unterschiede in der Zeichenfolgenverarbeitung zwischen Python, Ruby, JS und PHP (Kombination und Variablenerweiterung)
Lösen mit Ruby und Python AtCoder CODE FESTIVAL 2016 qual C B Priority Queue
Unterschiede beim Schreiben von externem Quellcode zwischen Ruby und Python
Zusammenfassung der Korrespondenz zwischen Ruby- und Python-Array-Operationen
Sofortige Methodengrammatik für Python und Ruby (Lernen)
Zusammenfassung der Unterschiede zwischen PHP und Python
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Angeben des Bereichs von Ruby- und Python-Arrays
[Python] Konvertierungsnotiz zwischen Zeitdaten und numerischen Daten
Über den Unterschied zwischen "==" und "is" in Python
Python-Handspiel (Interoperation zwischen CSV und PostgreSQL)
Serielle Kommunikation zwischen Raspberry pi - Arduino Uno (Python)
Über flache und tiefe Kopien von Python / Ruby
Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Der Zeitpunkt, zu dem der Wert des Standardarguments ausgewertet wird, unterscheidet sich zwischen Ruby und Python.