Worker 连接到服务器但在客户端上使用多处理包执行 (python 2.7)
Worker connecting to server but executing on client with multiprocessing package (python 2.7)
先post来了,大家好
我对 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函数就是为了让worker处理很多,所以我可以把他们的监控activity变成Activity监控或者用top监控。
问题是进程连接(事实上,如果我输入了错误的地址,它们不会连接)但它们是在本地机器上执行的,因为我看到服务器 CPU 保持空闲,而本地 CPU 全部接近 100%。
我是不是弄错了什么?
您正在客户端本地启动 Process
。 p
和 for each in p: each.start()
在您的客户端上执行,它是 运行 并启动工作人员。
虽然每个 Process
"connects" 通过 mgr.connect()
到 Manager
它从不与之交互。本地 Process
es 不会仅仅因为您打开了连接就神奇地传输到您的服务器。此外,Manager
并不意味着 运行 工人,而是 meant to share data。
您必须在服务器上启动工作器,然后将工作发送到那里。
先post来了,大家好
我对 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函数就是为了让worker处理很多,所以我可以把他们的监控activity变成Activity监控或者用top监控。 问题是进程连接(事实上,如果我输入了错误的地址,它们不会连接)但它们是在本地机器上执行的,因为我看到服务器 CPU 保持空闲,而本地 CPU 全部接近 100%。 我是不是弄错了什么?
您正在客户端本地启动 Process
。 p
和 for each in p: each.start()
在您的客户端上执行,它是 运行 并启动工作人员。
虽然每个 Process
"connects" 通过 mgr.connect()
到 Manager
它从不与之交互。本地 Process
es 不会仅仅因为您打开了连接就神奇地传输到您的服务器。此外,Manager
并不意味着 运行 工人,而是 meant to share data。
您必须在服务器上启动工作器,然后将工作发送到那里。