【问题标题】:Python: Asynchronous http requests sent in order with automatic handling of cookies?Python:按顺序发送异步http请求并自动处理cookie?
【发布时间】:2010-02-22 23:43:52
【问题描述】:

我正在编写一个到 Web 服务的 python (2.6) 接口。我需要通过 http 进行通信,以便:

  • Cookies 会自动处理,
  • 请求是异步的
  • 遵守发送请求的顺序(接收对这些请求的响应的顺序无关紧要)。

我尝试了可以​​从内置库中轻松派生的内容,但面临不同的问题:

  • 使用httpliburllib2,请求是同步的,除非我使用thread,在这种情况下不能保证遵守顺序,
  • 使用asyncore,没有库可以自动处理网络服务发送的cookie。

经过一番谷歌搜索,似乎有很多 Python 脚本或库示例符合 3 个条件中的 2 个,但不是其中的 3 个。我正在考虑通读cookielib 资源并将我需要的内容调整为asyncore(或仅以ad hoc 方式适用于我的应用程序),但没有这样的东西似乎很奇怪还存在,因为我想我不是唯一感兴趣的人。如果有人知道有关此问题的指针,将不胜感激。

谢谢。

编辑澄清:

我正在做的是一个本地代理,它将我的 IRC 客户端与网络聊天接口。它创建一个侦听 IRC 连接的套接字,然后在接收到一个后,它通过 http 登录网络聊天。我无权访问网络聊天的行为,它使用 cookie 作为会话 ID。当客户端向我的 python 代理发送多个 IRC 请求时,我必须通过 http 和 cookie 将它们转发到网络聊天的服务器。我也想异步执行此操作(我不想在发送下一个请求之前等待 http 响应),目前发生的情况是发送 http 请求的顺序不是 IRC 的顺序命令已收到。

我希望这可以澄清问题,如果没有,我当然会详细说明。

【问题讨论】:

  • 我认为如果你描述你真正想做的事情,你会得到更好的帮助,因为你描述的东西很难理解。为什么 cookie 会参与到您不关心响应何时到来的序列中?

标签: python http asynchronous cookies


【解决方案1】:

使用 httplib 和 urllib2, 请求是同步的,除非我使用 线程,在这种情况下,顺序不是 保证得到尊重

除非您在将响应发送到第二个连接之前从第一个连接得到响应,否则您怎么知道该命令已得到遵守?毕竟,您并不关心响应的顺序,因此很可能响应以您期望的顺序返回,但您的请求以错误的顺序处理!

您可以保证订购的唯一方法是在开始第二个请求之前等待第一个请求已成功到达的确认(例如,您开始接收它的响应)。您可以通过在到达第一个线程的响应处理部分之前不启动第二个线程来做到这一点。

【讨论】:

  • 非常感谢您的回答。我仍然有一些担忧:HTTP 是否不能保证接收方按照发送顺序处理数据包(因为它是基于 TCP 构建的,并且与 TCP 一样)?在那种情况下,在 HTTP 级别,我所要做的就是同步发送,异步接收。我假设有什么问题吗?此外,我确实可以只线程化响应处理部分,但 IRC 有时会同时发送许多命令:它会使它们的处理时间更长,大约与 ping 一样多。 (请注意,我编辑了更多关于我想要实现的目标的问题)
  • TCP 确实保证数据按给定连接的顺序保存,但是当您发出多个 HTTP 请求时,您通常不会使用相同的连接进行它们,因此保证与您的情况无关。特别是,您不能以您喜欢的方式拆分请求和响应,因为您无法保证请求已被实际处理,即使您发送了整个内容,直到您看到响应。我认为您的异步性要求基本上与您的订购要求不兼容。
  • 是的,你是对的,只是因为它在 TCP 上而将订单保留在 HTTP 中的假设是错误的。我将检查我想到的最后一个选项(一种通过单个 HTTP 请求发送多个 IRC 命令的方法,如果我要连接的 Web 界面允许它),如果它不起作用,我将不得不做出选择(这可能是一种中间选择,例如以不同的方式处理顺序重要的命令和不重要的命令)。再次感谢您的有用回答。
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多