À 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.
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).
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
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.
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