【问题标题】:Python multithreading - Global Interpreter LockPython 多线程 - 全局解释器锁
【发布时间】:2014-05-06 23:39:42
【问题描述】:

Python threading module 文档是这样说的

在 CPython 中,由于全局解释器锁,只有一个线程可以 立即执行 Python 代码(即使某些面向性能的 图书馆可能会克服这个限制)。如果你想要你的 应用程序以更好地利用计算资源 多核机器,建议使用多处理。然而, 如果你想运行多个线程仍然是一个合适的模型 I/O 密集型任务同时进行。

有人可以解释我是否可以在我的情况下使用线程模块吗?

我将检测网站使用的框架。

这就是我的应用程序的工作原理

  • 我的 MySQL 数据库包含大约 1000 万个域(id、域、框架)
  • 从数据库中获取 1000 行
  • 使用请求模块逐个抓取域
  • 检测框架
  • 使用结果更新数据库行。

由于我有 1000 万个域,因此需要很长时间。所以我想通过使用线程来加速这个过程。

但我不确定我的应用是否受 I/O 限制。谁能解释一下?

谢谢

【问题讨论】:

    标签: python mysql multithreading


    【解决方案1】:

    我猜,最耗时的活动将是获取所有 url。

    所以您的问题的答案是:是的,您的应用很可能是 I/O 绑定的。

    您打算逐个抓取域,这将导致非常长的处理时间。你一定要同时做。 in my answer to similar question 描述了一种与抓取网站相关的解决方案。

    无论如何,您的 url 的数量似乎真的很大,您可能需要利用将工作分配给多个工作人员的优势 - 为此您可以使用例如芹菜框架。但是,由于您的任务确实受 I/O 限制,如果您的工作人员在多台计算机上工作,最好是独立连接,您将获得一些速度。我在 DigitalOcean 机器上做了类似的任务,效果很好。

    【讨论】:

    • 感谢您的回答。我也在使用数字海洋。您是否建议我使用多个小液滴而不是一个大液滴?
    • @Giri 就我个人而言,我将从同时使用单个脚本获取 url 开始 - 您将了解什么是实时的,并且对于您的用例来说它可能足够快。我正在处理 3*3*365*1440 文件,每个文件大小约为 500 kB(获取、tar、发布),所以我对连接性的要求比我预期的要高。顺便说一句 - 我在 DO 上使用了大约 80 Mbps 的上传/下载速度。在 Celery 中使用多个液滴会起作用,但会带来一些复杂性。
    • 好的。我打算按照这个脚本来制作我的脚本。 gist.github.com/olsososo/6076469 但你是在推荐芹菜。你确定在我的情况下它不会矫枉过正吗?
    • @Giri - 我建议 Celery 只是为了以防万一,您更简单的解决方案将无法正常工作 - 否则 Celery 是矫枉过正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多