我在向服务器(XMLRPC-C)发送XMLRPC请求时遇到了一种奇怪的行为。我打算与一组进程同时发送多个请求,如下所示。每次我发出请求时,我都会创建一个新的ServerProxy对象。我知道这会导致性能不佳,相反,我应该为每个进程只创建一个对象,然后重新使用这些对象进行后续调用。但是我所遇到的问题更加清晰可见(并且很容易解释)。
XMLRPC-C库的参数MAX_CONN默认为16。
所以,让我说我有50个句子的文本,并且我将为每个句子启动一个XMLRPC请求(我想翻译它们)。使用下面的代码,一切都按预期工作,前20个请求被启动,只有16个同时执行(MAX_CONN = 16),当这16个请求完成时,剩余的34个请求被执行(当轮到它时)。
但是,如果我将“server”变量设为全局(通过在“rpc_call”函数的开头添加“global server”),就会出现问题。在这种情况下,会发生什么:
请注意,有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()