具有全局ServerProxy对象的并发XMLRPC-C调用未按预期工作

时间:2014-03-03 18:54:09

标签: python-2.7 global-variables multiprocessing xml-rpc

我在向服务器(XMLRPC-C)发送XMLRPC请求时遇到了一种奇怪的行为。我打算与一组进程同时发送多个请求,如下所示。每次我发出请求时,我都会创建一个新的ServerProxy对象。我知道这会导致性能不佳,相反,我应该为每个进程只创建一个对象,然后重新使用这些对象进行后续调用。但是我所遇到的问题更加清晰可见(并且很容易解释)。

XMLRPC-C库的参数MAX_CONN默认为16。

所以,让我说我有50个句子的文本,并且我将为每个句子启动一个XMLRPC请求(我想翻译它们)。使用下面的代码,一切都按预期工作,前20个请求被启动,只有16个同时执行(MAX_CONN = 16),当这16个请求完成时,剩余的34个请求被执行(当轮到它时)。

但是,如果我将“server”变量设为全局(通过在“rpc_call”函数的开头添加“global server”),就会出现问题。在这种情况下,会发生什么:

  • 发布了20个请求
  • 16到服务器完成
  • 第一批20个未启动的30个请求进入服务器并完成

请注意,有4个请求“丢失”,在第一批20个中启动但未立即执行的请求。客户端没有完成,因为它仍在等待这些响应。但是,如果客户端被杀死(Ctrl-C),那么这4个句子最终会被执行,但是没有客户端将它们返回。

显然,在这个例子中我不需要将该变量设为全局变量。但是为了做我在第一段中说的(重用ServerProxy对象),我确实需要它(这里来了:Python Multiprocessing. How to enqueue XMLRPC ServerProxy objects),我想知道为什么会这样,所以我可以解决一些问题

aux.py

def translate(sentence, server):
    param= {'text': '', 'align': False}
    param['text']=sentence
    txt=server.translate(param)
    return txt

main.py

def rpc_call(sentence):
    server = xmlrpclib.ServerProxy('http://myserver:6060/RPC2',)
    result= aux.translate(sentence, server)

if __name__ == '__main__':
    text=list() 
    [...]

    processes=20
    pool = Pool (processes)

    for sentence in text:
        pool.apply_async(rpc_call, args=(sentence,))

    pool.close()
    pool.join()

0 个答案:

没有答案