簡體   English   中英

工作者連接到服務器但在具有多處理包的客戶端上執行(python 2.7)

[英]Worker connecting to server but executing on client with multiprocessing package (python 2.7)

先發帖,大家好。

使用python 2.7的多處理包有問題。 我希望在服務器上並行運行一些進程; 他們確實連接,但他們在本地執行。

這是我在服務器上使用的代碼(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()

雖然這是在客戶端上運行的代碼(Mac OS 10.11):

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()

for循環

for k in range(1000000000):
    sqrt(k * k)

在worker函數中只是為了讓工作者處理很多,所以我可以將他們的活動監視到Activity Monitor或者top。 問題是進程連接(事實上如果我把錯誤的地址放在他們沒有的地方)但是它們是在本地機器上執行的,因為我看到服務器CPU保持空閑,而本地CPU全部達到100%。 我弄錯了嗎?

您正在客戶端本地啟動Process pp for each in p: each.start()在您的客戶端上執行,運行它並啟動工作程序。

當每個Process通過mgr.connect() “連接”到Manager ,它永遠不會與它交互。 本地Process不會因為您打開連接而神奇地轉移到您的服務器。 此外, Manager不是為了運行worker,而是為了共享數據

你必須在服務器上啟動工作人員,然后將工作發送到那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM