繁体   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