1

Erste Post hier, Hallo an alle.Arbeitskraft, die Verbindung zum Server herstellt, aber auf dem Client mit Multiprocessing-Paket (Python 2.7)

Ich habe ein Problem mit dem Multiprocessing-Paket mit Python 2.7. Ich möchte einige Prozesse parallel auf einem Server laufen lassen; Sie verbinden sich, aber sie werden stattdessen lokal ausgeführt.

Dies ist der Code, den ich auf dem Server verwenden (Ubuntu 14.04):

from multiprocessing import Process 
from multiprocessing.managers import BaseManager 
from multiprocessing import cpu_count 

class MyManager(BaseManager): 
    pass 

def server(): 
    mgr = MyManager(address=("", 2288), authkey="12345") 
    mgr.get_server().serve_forever() 

if __name__ == "__main__": 
    print "number of cpus/cores:", cpu_count() 

    server = Process(target=server) 

    server.start() 
    print "server started" 

    server.join() 
    server.terminate() 

während dies der Code, der auf dem Client (Mac OS 10.11) läuft, ist:

from multiprocessing import Manager 
from multiprocessing import Process 
from multiprocessing import current_process 
from multiprocessing.managers import BaseManager 
from math import sqrt 

class MyManager(BaseManager): 
    pass 

def worker(address, port, authkey): 
    mgr = MyManager(address=(address, port), authkey=authkey) 
    try: 
     mgr.connect() 
     print "- {} connected to {}:{}".format(current_process().name, address, port) 
    except: 
     print "- {} could not connect to server ({}:{})".format(current_process().name, address, port) 
    current_process().authkey = authkey 
    for k in range(1000000000): 
     sqrt(k * k) 

if __name__ == "__main__": 
    # create processes 
    p = [Process(target=worker, args=("xx.xx.xx.xx", 2288, "12345")) for _ in range(4)] 

    # start processes 
    for each in p: 
     each.start() 
    # join the processes 
    for each in p: 
     each.join() 

Die für Schleife

das ist in der Worker-Funktion ist nur, um die Arbeiter viel verarbeiten lassen, damit ich ihre Aktivität überwachen kann in Aktivitätsmonitor oder mit top. Das Problem ist, dass die Prozesse verbinden (in der Tat, wenn ich eine falsche Adresse sie nicht) aber sie werden auf dem lokalen Rechner ausgeführt, wie ich die Server-CPUs Leerlauf sehen, während die lokalen CPUs gehen alle zu 100% . Bin ich etwas falsch?

+0

Sie beginnen Ihre Arbeiter vor Ort, was haben Sie erwartet? oO – MisterMiyagi

Antwort

0

Sie starten Ihre Process lokal auf Ihrem Client. und for each in p: each.start() wird auf Ihrem Client ausgeführt, wo er ausgeführt wird und die Worker startet.

Während jedes Process über mgr.connect() mit dem Manager "verbindet", interagiert es nie mit ihm. Die lokalen Process es werden nicht magisch auf Ihren Server übertragen, nur weil Sie eine Verbindung geöffnet haben. Darüber hinaus ist eine Manager nicht zum Ausführen von Arbeitern gedacht, es ist meant to share data.

Sie müssten Arbeiter auf dem Server starten, dann senden Arbeit dorthin.

+1

Als zusätzliche Information können Sie Multiprocessing-Clients und -Listener https://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing#module-multiprocessing.connection verwenden – MKesper