gpt4 book ai didi

python - python 2.7下xmlrpclib.ServerProxy的多线程问题

转载 作者:太空狗 更新时间:2023-10-30 00:02:49 41 4
gpt4 key购买 nike

我有一个实例化 xmlrpclib.ServerProxy 一次的应用程序,然后将其传递给多个线程(Web 应用程序请求),这些线程都同时执行 XML/RPC 调用。这适用于 python 2.6。使用 python 2.7,一旦进入多线程环境,我们就会收到很多错误(ResponseNotReadyCannotSendRequest)。

# This code works well in python 2.6, and breaks in python 2.7.

import xmlrpclib
import thread

proxy = xmlrpclib.ServerProxy("http://localhost:5000/")

def fetch_users():
print proxy.getUsers()

for _ in range(10):
thread.start_new_thread(fetch_users, ())

while(1):
pass

这里的问题是什么,是否有一种线程安全的方法来重新使用 ServerProxy 对象?

最佳答案

我们找到了问题的原因:在 python 2.6 中,在每次 XML/RPC 方法调用时都会创建一个 TCP 连接。另一方面,Python 2.7 为每个 ServerProxy 对象打开一个 TCP 连接,并保持打开状态(使用支持 keep-alive 的服务器)。此外,该类不是线程安全的,因此并发请求可能会相互干扰。

显然,2.6 版本隐含地是线程安全的,因为 TCP 连接不会被重用,并且所有特定于连接的数据似乎都保存在非共享堆栈变量中。

所以可能的解决方案是:

  1. 为每个线程创建一个 ServerProxy 对象(并隐式打开一个 TCP 连接)
  2. 锁定对单个共享 ServerProxy 对象的访问
  3. 实现请求队列

关于python - python 2.7下xmlrpclib.ServerProxy的多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25522228/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com