RPC complété avec des modules Python 3 standard

table des matières

Il y a trop de types de RPC dans Python aujourd'hui

À partir de 2020, de nombreux RPC ont été publiés en tant que logiciels libres, mais il y en a trop de types, et l'augmentation associée du coût de sélection, du coût d'évaluation et du coût d'apprentissage sont des problèmes personnels. Je sens ça.

Puisque le temps est précieux lorsque je travaille en tant que membre de la société, j'étudie des bibliothèques qui apparaissent les unes après les autres et j'apprends à les utiliser lorsque je fais rapidement du PoC ou lorsque je ferme des API, etc. Ce n'est pas approprié pour fabriquer un bon produit.

En Python, la classe «manager» existe en «multitraitement», et un appel de procudure à distance haute performance peut être implémenté en exploitant la communication inter-processus pendant le multi-traitement sur le réseau.

Remote Procudure Call (RPC) est un autre ordinateur du réseau qui appelle ou traite un type de traitement pour effectuer un traitement distribué à grande échelle. Pratique.

Valeur qui peut être exécutée avec des bibliothèques standard

J'ai utilisé beaucoup de bibliothèques, mais les responsables de ces bibliothèques sont partis, je n'ai pas de système pour accepter les pull requests, ou je n'ai pas le temps. De nombreuses bibliothèques apparemment «bonnes» ont été laissées pour compte dans le passé.

Si possible, indépendant de la bibliothèque et facile à implémenter, il peut être utilisé tant que Python existe (ou n'est pas obsolète en Python).

Description du code

C'est un élément qui peut être divisé en «serveur» et «client», où «serveur» écoute une instruction et «client» émet une instruction.

server

from multiprocessing.managers import BaseManager as Manager
import os

#En supposant que KVS en mémoire
obj = {}
def get(k):
    print('get', k)
    return obj.get(k)

def put(k, v):
    obj[k] = v
    print('put', k,v)

#Obtenir le nom du serveur(Fonctions qui comprennent Linux et MacOS)
def get_uname():
    print('get_uname')
    return str(os.uname())

if __name__ == "__main__":
    port_num = 4343
    Manager.register("get", get) #Enregistrer la fonction utilisée pour la veille
    Manager.register("put", put)
    Manager.register("get_uname", get_uname)
    manager = Manager(("", port_num), authkey=b"password") #Les instructions peuvent être acceptées de n'importe où en laissant le nom d'hôte vide. Le mot de passe peut être défini
    manager.start()
    input("Press any key to kill server".center(50, "-")) #Entrez quelque chose et terminez
    manager.shutdown()

client

from multiprocessing.managers import BaseManager as Manager
Manager.register("get") #Fonction d'enregistrement
Manager.register("put")
Manager.register("get_uname")

if __name__ == "__main__":
    port_num = 4343

    manager = Manager(address=('25.48.219.74', port_num), authkey=b"password")
    manager.connect()
    print('get', manager.get('a')) #Aucun ne devrait être de retour
    print('put', manager.put('a', 10)) # a ->Jeu 10
    print('get', manager.get('a').conjugate()) #10 devrait être de retour, (Pour le type primitif, etc., récupérez la valeur avec la fonction conjuguée)
    print('get_uname', manager.get_uname()) #J'exécute le client sur MacOS, mais Linux sur le serveur devrait revenir

Essayez de le déplacer

J'ai exécuté le programme ci-dessus à partir de Linux (Ubuntu) pour le serveur, MacOS (darwin) pour le client, et d'un café de dépanneur à mon PC à la maison.

Le résultat était comme prévu et j'ai pu le faire fonctionner de manière arbitraire.

Avec cela, par exemple, il semble que vous puissiez traiter le nombre de vues YouTube, les mots-clés de tendance Twitter, etc. Vous pouvez agréger les données.

Il est important d'apprendre d'excellents nouveaux outils, mais il est également important de garder les outils existants petits, et le coût global de réalisation de ce que vous voulez faire est très faible, donc cette personne est certainement la bienvenue. Je vous serais reconnaissant si vous pouviez examiner la loi.

Bonus: code de décompte des téléspectateurs YouTube

J'ai forké le client et l'ai essayé en supposant qu'il y avait un grand nombre d'accès de plusieurs personnes.

cleint

from concurrent.futures import ProcessPoolExecutor
import random
from multiprocessing.managers import BaseManager as Manager
Manager.register("get")  #Fonction d'enregistrement
Manager.register("inc")

def extract(x):
    if hasattr(x, 'conjugate'):
        return x.conjugate()
    else:
        return x


def hikakin_watch(num):
    port_num = 4343
    manager = Manager(address=('127.0.0.1', port_num), authkey=b"password")
    manager.connect()
    for i in range(1000):
        try:
            now = extract(manager.get('hikakin'))
            print(now)
            manager.inc('hikakin')
        except Exception as exc:
            print(exc)

if __name__ == "__main__":
    with ProcessPoolExecutor(max_workers=5) as exe:
        exe.map(hikakin_watch, list(range(5)))
    
    port_num = 4343
    manager = Manager(address=('127.0.0.1', port_num), authkey=b"password")
    manager.connect()
    now = extract(manager.get('hikakin'))
    print(now)

server

from multiprocessing.managers import BaseManager as Manager
import os

#En supposant que KVS en mémoire
obj = {}
def get(k):
    if k not in obj:
        obj[k] = 0
    return obj.get(k)

def inc(k):
    obj[k] += 1

if __name__ == "__main__":
    port_num = 4343
    Manager.register("get", get) #Enregistrer la fonction utilisée pour la veille
    Manager.register("inc", inc)
    manager = Manager(("", port_num), authkey=b"password") #Les instructions peuvent être acceptées de n'importe où en laissant le nom d'hôte vide. Le mot de passe peut être défini
    manager.start()
    input("Press any key to kill server".center(50, "-")) #Entrez quelque chose et terminez
    manager.shutdown()

La sortie attendue était de 5 000, et il a été constaté que le contrôle exclusif peut être correctement effectué même pour un accès parallèle.

Il semble qu'il puisse être utilisé pour compter le nombre de vues sur YouTube.

Recommended Posts

RPC complété avec des modules Python 3 standard
Représentation matricielle avec entrée standard Python
Conforme à la norme de codage Python PEP8
Calculer et afficher le poids standard avec python
Le module Python avec "- (trait d'union)" ne peut pas être supprimé
UnicodeEncodeError lutte avec la sortie standard de python3
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
[Python] Entrée standard
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
MessagePack-Try pour lier Java et Python avec RPC
Lire les fichiers wav avec uniquement le package standard Python
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Liste des modules python
Grattage en Python (préparation)
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Paquets et modules Python
Publier des tweets avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Obtenez une sortie standard en temps réel avec le sous-processus Python
Utiliser Kinesis avec Python
Premiers pas avec Python
Utiliser DynamoDB avec Python
Getter Zundko avec python
Gérez Excel avec python