连接到服务器但使用多处理包在客户端上执行的辅助进程(Python2.7)

2024-06-09 20:04:39 发布

您现在位置:Python中文网/ 问答频道 /正文

第一篇帖子,大家好。你知道吗

我对Python2.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函数中,它只是让worker处理大量的事务,所以我可以将它们的活动监视到activity monitor或top中。 问题是进程连接(事实上,如果我输入了一个错误的地址,它们就不会连接),但它们是在本地机器上执行的,因为我看到服务器cpu保持空闲,而本地cpu都接近100%。 我做错什么了吗?你知道吗


Tags: nameinfromimportforserveraddresscpu
1条回答
网友
1楼 · 发布于 2024-06-09 20:04:39

您正在客户端本地启动Processpfor each in p: each.start()在客户机上执行,在那里运行并启动worker。你知道吗

当每个Process通过mgr.connect()Manager连接时,它从不与之交互。本地Process不会仅仅因为您打开了一个连接就神奇地传输到您的服务器。此外,Manager并不意味着运行worker,它是meant to share data。你知道吗

您必须在服务器上启动workers,然后将工作发送到那里。你知道吗

相关问题 更多 >