如何同时向多个不同的xmlrpc服务器发起xmlrpc调用
有没有办法让一个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。