Ab 2020 wurden viele RPCs als OSS veröffentlicht, aber es gibt zu viele Typen, und die damit einhergehende Erhöhung der Auswahlkosten, die Erhöhung der Bewertungskosten und die Erhöhung der Lernkosten sind persönliche Probleme. Ich fühle, dass.
Da Zeit für die Arbeit als Mitglied der Gesellschaft kostbar ist, studiere ich Bibliotheken, die nacheinander angezeigt werden, und lerne, wie man sie verwendet, wenn PoC schnell ausgeführt wird oder wenn APIs usw. geschlossen werden. Es ist nicht angemessen, ein gutes Produkt herzustellen.
In Python existiert die "Manager" -Klasse in "Multiprocessing", und ein leistungsstarker Remote Procudure Call kann implementiert werden, indem die prozessübergreifende Kommunikation während der Multiprocessing-Funktion über das Netzwerk ausgeführt wird.
Remote Procudure Call (RPC) ist ein weiterer Computer im Netzwerk, der eine Verarbeitung aufruft oder verarbeitet, um eine verteilte Verarbeitung in großem Maßstab durchzuführen. Praktisch.
Ich habe viele Bibliotheken verwendet, aber die Betreuer dieser Bibliotheken sind weg, ich habe kein System zum Akzeptieren von Pull-Anfragen oder ich habe keine Zeit. Viele der Bibliotheken, die "gut" zu sein schienen, wurden in der Vergangenheit zurückgelassen.
Wenn möglich, bibliotheksunabhängig und einfach zu implementieren, kann es verwendet werden, solange Python existiert (oder in Python nicht veraltet ist).
Es ist ein Element, das in "Server" und "Client" unterteilt werden kann, wobei "Server" auf eine Anweisung wartet und "Client" eine Anweisung ausgibt.
server
from multiprocessing.managers import BaseManager as Manager
import os
#Angenommen, In-Memory-KVS
obj = {}
def get(k):
print('get', k)
return obj.get(k)
def put(k, v):
obj[k] = v
print('put', k,v)
#Server nicht benennen(Funktionen, die Linux und MacOS verstehen)
def get_uname():
print('get_uname')
return str(os.uname())
if __name__ == "__main__":
port_num = 4343
Manager.register("get", get) #Registrieren Sie die für den Standby verwendete Funktion
Manager.register("put", put)
Manager.register("get_uname", get_uname)
manager = Manager(("", port_num), authkey=b"password") #Anweisungen können von überall akzeptiert werden, indem der Hostname leer gelassen wird. Passwort kann eingestellt werden
manager.start()
input("Press any key to kill server".center(50, "-")) #Geben Sie etwas ein und beenden Sie
manager.shutdown()
client
from multiprocessing.managers import BaseManager as Manager
Manager.register("get") #Registerfunktion
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')) #Keiner sollte zurück sein
print('put', manager.put('a', 10)) # a ->Set 10
print('get', manager.get('a').conjugate()) #10 sollte zurück sein, (Rufen Sie für primitiven Typ usw. den Wert mit der konjugierten Funktion ab)
print('get_uname', manager.get_uname()) #Ich verwende den Client unter MacOS, aber Linux auf dem Server sollte zurückkehren
Ich habe das obige Programm von Linux (Ubuntu) für Server, MacOS (Darwin) für Client und von einem Supermarktcafé auf meinen Heim-PC ausgeführt.
Das Ergebnis war wie erwartet und ich konnte es willkürlich zum Laufen bringen.
Auf diese Weise können Sie beispielsweise die Anzahl der YouTube-Aufrufe, Trend-Keywords von Twitter usw. verarbeiten und effizient datieren, ohne BigQuery, RedShift usw. häufig ausführen zu müssen. Sie können die Daten aggregieren.
Es ist wichtig, großartige neue Tools zu erlernen, aber es ist auch wichtig, die vorhandenen Tools klein zu halten, und die Gesamtkosten für das Erreichen der gewünschten Ziele sind sehr niedrig. Daher ist diese Person auf jeden Fall willkommen. Ich würde es begrüßen, wenn Sie das Gesetz berücksichtigen könnten.
Ich gabelte den Client und versuchte es unter der Annahme, dass mehrere Personen Zugriff hatten.
cleint
from concurrent.futures import ProcessPoolExecutor
import random
from multiprocessing.managers import BaseManager as Manager
Manager.register("get") #Registerfunktion
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
#Angenommen, In-Memory-KVS
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) #Registrieren Sie die für den Standby verwendete Funktion
Manager.register("inc", inc)
manager = Manager(("", port_num), authkey=b"password") #Anweisungen können von überall akzeptiert werden, indem der Hostname leer gelassen wird. Passwort kann eingestellt werden
manager.start()
input("Press any key to kill server".center(50, "-")) #Geben Sie etwas ein und beenden Sie
manager.shutdown()
Die erwartete Ausgabe betrug 5000, und es wurde festgestellt, dass die exklusive Steuerung auch für den parallelen Zugriff ordnungsgemäß durchgeführt werden kann.
Es scheint, dass es zum Zählen der Anzahl der Aufrufe auf YouTube verwendet werden kann.
Recommended Posts