【问题标题】:Python accessing multiple webpages at oncePython一次访问多个网页
【发布时间】:2010-11-12 10:16:08
【问题描述】:

我有一个 tkinter GUI,可以同时从多个网站下载数据。我为每次下载运行一个单独的线程(大约 28 个)。一个 GUI 进程的线程太多了吗?因为它真的很慢,每个单独的页面应该需要大约 1 到 2 秒,但是当所有页面同时运行时需要 40 多秒。有什么办法可以缩短下载所有页面的时间吗?任何帮助表示赞赏,谢谢。

【问题讨论】:

    标签: python user-interface multithreading download tkinter


    【解决方案1】:

    可能是 GIL(全局解释器锁)妨碍了您。 Python 在多线程方面存在一些性能问题。

    您可以尝试 twisted.web.getPage(请参阅页面下方的http://twistedmatrix.com/projects/core/documentation/howto/async.html)。 我没有这方面的基准。 但是以该页面上的示例并添加 28 个 deferreds 来看看它有多快会给你一个相当快的可比结果。 但请记住,您必须使用 gtk reactor 并进入 twisteds 编程风格。

    【讨论】:

    • 我对此表示怀疑:这就是 TCP 套接字被缓冲的原因。出于好奇,我必须尝试一下,但我希望套接字缓冲能够在很大程度上解决这个问题。
    • 我阅读了那个页面,它看起来非常有用,如果我找不到更简单的东西,我可能会尝试使用 Twisted,谢谢。
    • 支持扭曲的推荐。编写和调试使用 twisted 的代码比使用等效线程代码要容易得多。
    • 如果您尝试扭曲的方式,请在此处发布您的结果。我会对结果感兴趣:)
    • 当然,我肯定会跟进此事,但可能需要一些时间,因为我现在没有时间。
    【解决方案2】:

    一个进程可以在任何现代操作系统上拥有数百个线程而不会出现任何问题。

    如果您受带宽限制,则 1 到 2 秒乘以 28 表示 40 秒大约是正确的。如果您的延迟有限,它应该会更快,但没有任何信息,我只能建议:

    • 在您的代码中添加日志记录以确保它实际上是并行运行的,并且您不会意外地以某种方式序列化您的线程;
    • 使用网络监视器确保网络请求实际上是并行发出的。

    如果没有更多信息,很难给出更好的东西。

    【讨论】:

    • 我检查了所有线程都同时启动并并行运行,但它们都在不同时间从 urllib 请求返回。我假设它与网络有关并一次处理多个请求。您认为这是问题所在还是其他原因?我可以同时运行多个网络请求吗?我在 windows xp 上,如果有帮助,我有无线连接。感谢您的帮助并原谅我的无知我不是一个网络人。
    【解决方案3】:

    您可以尝试使用进程而不是线程。 Python 有 GIL,这可能会导致您的情况出现一些延迟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多