Communication inter-processus entre Ruby et Python (file d'attente de messages POSIX)

Aperçu

Quand je pensais à passer des données entre les démons ruby et python en utilisant redis (Pub / Sub) [^ Streams], j'ai entendu une voix céleste me dire qu'il serait plus facile d'utiliser la communication inter-processus (POSIX IPC), alors je l'ai essayé. Je l'ai essayé.

De plus, comme il fonctionnera cette fois sur le raspberry pi, nous envisageons une stratégie pour réduire au maximum le nombre de processus en raison de problèmes d'alimentation.

[^ Streams]: De redis5, il existe une fonctionnalité supplémentaire appelée Streams qui est plus fiable que la fonctionnalité Pub / Sub.

Qu'est-ce qu'une file d'attente de messages POSIX?

Une des communications inter-processus qui peut être utilisée via la fonction d'appel système / bibliothèque de POSIX. Protocole de communication asynchrone, comme une version super simplifiée d'un middleware de messagerie tel que Rabbit MQ, sans crainte de malentendu. Comme il est conforme à POSIX, il peut être facilement utilisé avec une simple API.

Veuillez vous référer à ce qui suit pour plus de détails.

https://linuxjm.osdn.jp/html/LDP_man-pages/man7/mq_overview.7.html

Le système au complet

Implémentation côté Ruby (côté expéditeur)

Peu importe lequel est envoyé / reçu, mais cette fois j'ai essayé Ruby en tant qu'expéditeur. J'ai utilisé posix-mqueue comme bibliothèque à utiliser. Très simple.

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

Implémentation côté Python (côté récepteur)

C'est aussi horriblement simple. La bibliothèque utilisée est 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)Reviens avec un taple
        print j
        if j.get('message') == "end":
            break

if __name__ == "__main__" : 
    main()

résultat

Il était sorti côté Python comme prévu!

$ 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'}

C'est une source simple, mais je l'ai postée sur github. https://github.com/y-amadatsu/posix-mq-with-raspberry-pi-os

De côté

D'ailleurs, si vous utilisez le message POSIX, la file d'attente des messages sera affichée sous / dev / mqueue. Il peut également être monté et utilisé avec "ls" ou "rm". Cette zone est très UNIX! C'est comme: détendu:

cat /dev/mqueue/whatever 
QSIZE:350        NOTIFY:0     SIGNO:0     NOTIFY_PID:0     

Recommended Posts

Communication inter-processus entre Ruby et Python (file d'attente de messages POSIX)
Différences entre Ruby et Python dans la portée
Différence entre Ruby et Python (syntaxe de base)
Ruby, Python et carte
[Ruby vs Python] Comparaison de référence entre Rails et Flask
Contrôler d'autres programmes depuis Python (communication entre Python ⇔ exe)
Différence entre Ruby et Python en termes de variables
Python sur Ruby et Ruby en colère sur Python
Mémo tranche python et rubis
Syntaxe Ruby et Python ~ branch ~
Pile et file d'attente en Python
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Différence entre == et est en python
Scraping avec Node, Ruby et Python
Gérer les files d'attente de messages posix en python
Coopération entre le module python et l'API
Différence entre Python, stftime et strptime
Différence entre la série python2 et la série python3 dict.keys ()
[Python] Différence entre fonction et méthode
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
Communiquez entre Elixir et Python avec gRPC
Communication socket et traitement multi-thread par Python
différence entre les instructions (instructions) et les expressions (expressions) en Python
Module d'implémentation de file d'attente et Python "deque"
Différences entre la syntaxe Python et Java
Différences dans la relation entre PHP et Python enfin et quitter
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
[Grammaire de base] Différences entre Ruby / Python / PHP
[Python] Différence entre la méthode de classe et la méthode statique
[Python3] Basculer entre Shift_JIS, UTF-8 et ASCII
[Python Iroha] Différence entre List et Tuple
Crypter avec Ruby (Rails) et décrypter avec Python
[python] Différence entre la sortie rand et randn
Différences de multithreading entre Python et Jython
Scraping Web facile avec Python et Ruby
Correspondance entre les fonctions intégrées de Python et Rust
Communication de données chiffrées entre Python et C #
Différences dans le traitement des chaînes entre Python, Ruby, JS et PHP (combinaison et expansion de variables)
Résolution avec Ruby et Python AtCoder CODE FESTIVAL 2016 qual C B Priority Queue
Différences dans la façon d'écrire du code source externe entre Ruby et Python
Résumé de la correspondance entre les opérations de tableau ruby et python
Grammaire de méthode instantanée pour Python et Ruby (étude)
Résumé des différences entre PHP et Python
La réponse de "1/2" est différente entre python2 et 3
Spécification de la plage des tableaux ruby et python
[Python] Mémo de conversion entre les données temporelles et les données numériques
À propos de la différence entre "==" et "is" en python
Jeu manuel Python (interopérabilité entre CSV et PostgreSQL)
Communication série entre Raspberry pi --Arduino Uno (Python)
À propos des copies superficielles et profondes de Python / Ruby
Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)
Le moment auquel la valeur de l'argument par défaut est évaluée diffère entre Ruby et Python.