3

有没有办法一次从 xmlrpc 客户端向不同的 xmlrpc 服务器进行多次调用。

我的服务器代码如下所示:(我将在两台机器上运行此代码,server1 和 server2)

class TestMethods(object):
    def printHello(self):
        while(1):
            time.sleep(10)
            print "HELLO FROM SERVER"
            return True

class ServerThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.server = SimpleXMLRPCServer(("x.x.x.x", 8000))
        self.server.register_instance(TestMethods())
    def run(self):
        self.server.serve_forever()

server = ServerThread()
server.start()

我的客户端代码如下所示:

import xmlrpclib

client1 = xmlrpclib.ServerProxy("http://x.x.x.x:8080") # registering with server 1
client2 = xmlrpclib.ServerProxy("http:/x.x.x.x:8080") # registering with server 2
ret1 = client1.printHello()
ret2 = client2.printHello()

现在,在第 10 秒,我将收到来自 server1 的响应,在第 20 秒,我将收到来自 server2 的响应,不幸的是,这不是我想要的。我试图一次调用两台机器,以便一次从这两台机器上得到响应。

请帮助我,提前谢谢。

4

1 回答 1

4

有几种不同的方法可以做到这一点。

python多处理

是用于并行运行的内置 python 模块。文档相当清楚。使用此方法的最简单和最可扩展的方法是使用一个“池”工作人员,您可以根据需要添加任意数量的工作人员。

from multiprocessing import Pool
import xmlrpclib

def hello_client(url):
    client = xmlrpclib.ServerProxy(url)
    return client.printHello()

p = Pool(processes=10)  # maximum number of requests at once.

servers_list = ['http://x.x.x.x:8080', 'http://x.x.x.x:8080']
# you can add as many other servers into that list as you want!

results = p.map(hello_client, servers_list)

print results

扭曲的蟒蛇

twisted python 是一个非常聪明的系统,用于编写各种多线程/并行/多进程的东西。文档有点混乱。

龙卷风

另一个非阻塞 python 框架。也很酷。 这是关于 XMLRPC、python 和 tornado的答案。

事件

一种允许在 python 中阻塞任务在后台发生的“神奇”方式。非常非常酷。这里有一个关于如何在 python 中使用 XMLRPC 和 gevent 的问题。

于 2014-08-08T09:39:31.223 回答