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

Python 2.7 全局ServerProxy对象的并发XMLRPC-C调用未按预期工作,python-2.7,global-variables,multiprocessing,xml-rpc,Python 2.7,Global Variables,Multiprocessing,Xml Rpc,我在向服务器XMLRPC-C发送XMLRPC请求时遇到了一个奇怪的行为。我打算用一个进程池同时发送几个请求,如下所示。每次发出请求时,我都会创建一个新的ServerProxy对象。我知道这会导致性能低下,相反,我应该为每个进程只创建一个对象,然后为后续调用重用这些对象。但我所面临的问题更为明显,也更容易用这种方式解释 XMLRPC-C库的参数MAX_CONN默认为16 所以,让我们假设我有一个包含50个句子的文本,并且我将为我想要翻译的每个句子启动一个XMLRPC请求。使用下面的代码,一切都按预

我在向服务器XMLRPC-C发送XMLRPC请求时遇到了一个奇怪的行为。我打算用一个进程池同时发送几个请求,如下所示。每次发出请求时,我都会创建一个新的ServerProxy对象。我知道这会导致性能低下,相反,我应该为每个进程只创建一个对象,然后为后续调用重用这些对象。但我所面临的问题更为明显,也更容易用这种方式解释

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

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

但是,如果通过在rpc_调用函数的开头添加global server使服务器变量成为全局变量,那么问题就会出现。在这种情况下,会发生以下情况:

发出20项请求 16到达服务器并完成 第一批20个请求中未启动的30个请求进入服务器并完成 请注意,有4个请求丢失,这些请求是在第一批(共20个)中启动的,不会立即执行。客户端没有完成,因为它仍在等待这些响应。但是,如果客户机在Ctrl-C中被杀死,那么这4句话最终会被执行,但是没有客户机可以返回它们

显然,在本例中,我不需要将该变量设置为全局变量。但是为了实现我在第一段中所说的重用ServerProxy对象,我确实需要它,这来自于:,我想了解为什么会发生这种情况,这样我就可以解决一些问题

副驾驶

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()