我需要同时从我的python脚本到多个物理服务器执行阻塞xmlrpc调用,并根据每个服务器的响应独立执行操作。 为了详细解释,我们假设遵循伪代码
while True:
response=call_to_server1() #blocking and takes very long time
if response==this:
do that
我想同时和独立地为所有服务器执行此操作,但是来自相同的脚本
答案 0 :(得分:1)
使用threading模块。
答案 1 :(得分:1)
Boilerplate线程代码(如果你给我一些关于你想要完成的更多细节,我可以定制这个代码)
def run_me(func):
while not stop_event.isSet():
response= func() #blocking and takes very long time
if response==this:
do that
def call_to_server1():
#code to call server 1...
return magic_server1_call()
def call_to_server2():
#code to call server 2...
return magic_server2_call()
#used to stop your loop.
stop_event = threading.Event()
t = threading.Thread(target=run_me, args=(call_to_server1))
t.start()
t2 = threading.Thread(target=run_me, args=(call_to_server2))
t2.start()
#wait for threads to return.
t.join()
t2.join()
#we are done....
答案 2 :(得分:0)
您可以使用多处理模块
import multiprocessing
def call_to_server(ip,port):
....
....
for i in xrange(server_count):
process.append( multiprocessing.Process(target=call_to_server,args=(ip,port)))
process[i].start()
#waiting process to stop
for p in process:
p.join()
答案 3 :(得分:0)
您可以使用多处理加队列。只需一个子流程即可:
import multiprocessing
import time
def processWorker(input, result):
def remoteRequest( params ):
## this is my remote request
return True
while True:
work = input.get()
if 'STOP' in work:
break
result.put( remoteRequest(work) )
input = multiprocessing.Queue()
result = multiprocessing.Queue()
p = multiprocessing.Process(target = processWorker, args = (input, result))
p.start()
requestlist = ['1', '2']
for req in requestlist:
input.put(req)
for i in xrange(len(requestlist)):
res = result.get(block = True)
print 'retrieved ', res
input.put('STOP')
time.sleep(1)
print 'done'
要使一个子流程更多,只需使用列表对象来存储您启动的所有子流程。 多处理队列是一个安全的对象。
然后,您可以跟踪每个子流程正在执行哪个请求,只需存储与工作数相关联的请求(当队列充满新工作时,工作计可以是计数器递增)。使用multiprocessing.Queue是健壮的,因为你不需要依赖stdout / err解析,你也避免了相关的限制。
然后,您还可以设置您希望get调用等待多长时间的超时,例如:
import Queue
try:
res = result.get(block = True, timeout = 10)
except Queue.Empty:
print error
答案 4 :(得分:0)
使用twisted。
它有很多用于网络工作的有用东西。它也非常擅长异步工作。