【问题标题】:Python XMLRPC with concurrent requests具有并发请求的 Python XMLRPC
【发布时间】:2010-12-08 00:44:33
【问题描述】:

我正在寻找一种方法来防止多个主机同时向 Python XMLRPC 侦听器发出命令。侦听器负责运行脚本以在该系统上执行任务,如果多个用户尝试同时发出这些命令,这些任务将失败。有没有办法在单个实例完成之前阻止所有传入的请求?

【问题讨论】:

  • 客户是否知道冲突矩阵?他们应该足够聪明,可以根据这个矩阵安排自己吗?他们的活动如何同步等等......
  • 你在使用 SimpleXMLRPCServer,因为我认为这是单线程...
  • 我正在使用 SimpleXMLRPCServer,但似乎我可以同时从不同的主机启动相同的命令,这是我需要防止的
  • 所以仔细检查它是按顺序执行的,按照先到先得的原则安排作业。使用一点控制逻辑 SimpleXMLRPCServer 应该完全符合我的要求,谢谢!

标签: python xml-rpc


【解决方案1】:

我认为 python SimpleXMLRPCServer 模块是你想要的。我相信该模型的默认行为是在处理当前请求时阻止新请求。默认行为给我带来了很多麻烦,我通过在 ThreadingMixIn 类中混合更改了该行为,以便我的 xmlrpc 服务器可以同时响应多个请求。

class RPCThreading(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
    pass

如果我正确理解您的问题,SimpleXMLRPCServer 就是解决方案。直接使用就好了。

【讨论】:

  • 我一直在将 SimpleXMLRPCServer 用于一个项目,并且正在采取另一种方式 - 需要并发请求处理,因为在处理请求时,客户端调用失败并出现 CannotSendRequest 异常。如果您不想要求实施重试,请注意。
【解决方案2】:

你能有另一个沟通渠道吗?如果是,则在服务器和客户端之间运行“轮到我时给我回电”协议。

换句话说,每个客户端都会注册其向服务器发出请求的意图,并且所述服务器会在准备好时“回调”下一个客户端。

【讨论】:

  • 我不一定关心回调客户端,更重要的是防止多个主机发出冲突命令
  • 你能发回一个 HTTP 5xx 代码吗(服务器繁忙或其他什么)?
  • 很多子进程shell命令复制文件,删除文件等
【解决方案3】:

有几种选择:

  1. 使用像SimpleXMLRPCServer这样的单进程单线程服务器来处理后续请求。
  2. 在线程服务器中使用threading.Lock()
  3. 多进程服务器中的一些外部锁定机制(如lockfile 模块或mysql 中的GET_LOCK() 函数)。

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2012-06-14
    • 2015-12-19
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多