在python中并行执行阻塞调用

时间:2011-07-21 12:11:57

标签: python

我需要同时从我的python脚本到多个物理服务器执行阻塞xmlrpc调用,并根据每个服务器的响应独立执行操作。 为了详细解释,我们假设遵循伪代码

while True:
    response=call_to_server1() #blocking and takes very long time
    if response==this:
        do that

我想同时和独立地为所有服务器执行此操作,但是来自相同的脚本

5 个答案:

答案 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

它有很多用于网络工作的有用东西。它也非常擅长异步工作。