如何同时向多个不同的xmlrpc服务器发起xmlrpc调用

3 投票
1 回答
2177 浏览
提问于 2025-04-18 14:33

有没有办法让一个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的响应,这显然不是我想要的结果。我想要同时向两台机器发起请求,这样我就能同时收到这两台机器的响应。

请帮帮我,谢谢!

1 个回答

4

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

python multiprocessing

这是一个内置的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

Twisted Python是一个非常聪明的系统,可以用来编写各种多线程、并行和多进程的程序。文档可能有点让人困惑。

Tornado

这是另一个非阻塞的Python框架,也非常酷。这里有一个关于XMLRPC、Python和Tornado的回答

gevent

这是一个“魔法”方式,可以让Python中的阻塞任务在后台运行。非常非常酷。而且这里有一个问题,讲的是如何在Python中使用gevent和XMLRPC。

撰写回答