【问题标题】:Python threads with urllib带有 urllib 的 Python 线程
【发布时间】:2011-10-06 12:42:57
【问题描述】:

我使用 python 来同时请求具有许多请求的 Web 服务。为此,我创建线程并使用 urllib(第一个版本,我使用 python 2.6)。 当我启动线程时,一切顺利,直到到达 ulllib.urlopen()。第二个线程必须等到第一个线程结束才能通过 ulllib.urlopen() 函数。由于我在从远程 Web 服务检索 Json 后做了很多工作,我希望第二个线程同时或在第一个线程关闭其套接字之后“urlopen”。

我尝试在收集返回的 JSON 后关闭打开的套接字,但它没有任何改变。第二个线程必须等待第一个线程结束。看看我用的是印刷品。

我可以理解 urllib 不是线程安全的(谷歌这并没有给出明确的答案)但是为什么第二个线程必须等待第一个结束(而不仅仅是套接字进程结束)?

感谢您的帮助和提示

PS:我不使用 Python 3 来兼容我需要的模块/包

【问题讨论】:

  • 如果可能,请包含示例代码

标签: python multithreading urllib python-2.6


【解决方案1】:

这听起来不是预期的行为,因为两个并行的 urllib 请求应该是可能的。您确定您的远程服务器可以处理两个并行请求(例如,它不是处于单线程调试模式)吗?

任何情况:线程不是 Python 并行编程的首选方法。使用进程或异步,尤其是在服务器端(你没有提到用例或你的平台也可能有问题)。

我在使用 Spawning 和 Eventlets 处理和转换 JSON/XML 方面有很好的经验,这些事件将 Python 套接字代码修补为异步。

http://pypi.python.org/pypi/Spawning/

http://eventlet.net/

【讨论】:

  • 好吧,事实上远程服务器不能处理并行请求(它的 Facebook FQL 网络服务)。我用我自己的 http 服务器尝试了这段代码(引入了响应延迟),一切正常。我会看看 eventlet,它非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2018-08-17
  • 2014-03-22
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多