【问题标题】:Multithreading to crawl large volume of URLs and download多线程抓取大量 URL 并下载
【发布时间】:2017-04-25 21:17:19
【问题描述】:

我一直在使用multithreading 来执行此操作,但是它挂了很多。我在考虑multiprocessing,但我不确定这是否更有优势。

我有一系列名字,每个名字都有一个日期范围。我为范围内的每个日期生成一个线程,然后在里面工作。一旦工作完成,它会将结果放入Queue() 以供main 更新GUI。

使用Queue() 来保存所需的 URL 是否比一次启动 350 个线程并等待更好?当我启动那么多线程时,Python 似乎挂起。

【问题讨论】:

  • 350 个线程很多。考虑一个进程或线程池。 pool.map_unordered 实现了一个返回队列,您可以使用它来提供 gui
  • @tdelaney for pool.map_unordered 我们在谈论多处理Pool()吗?
  • 我们在这里讨论的请求总数是多少?
  • multiprocessing.Pool 是多个进程。相同的接口被实现为multiprocessing.pool.ThreadPool 的线程池。子进程实现了更好的并行性,但来回传递数据是有代价的。如果处理量大,返回数据比较少,是更好的选择。
  • @tdelaney 如果我要访问这些 url 并下载 20-65MB 的文件,这仍然是最好的方法吗?

标签: python multithreading python-2.7


【解决方案1】:

据我了解,线程更擅长等待(I/O 绑定工作),而多处理更擅长 CPU 绑定工作。看来线程/绿色线程是要走的路。查看aiohttp 库,或者我可以建议scrapy,它在异步的扭曲框架上运行。这些(尤其是scrapy)中的任何一个都可以解决您的问题。但是当scrapy拥有你需要的一切时,为什么还要自己动手来重新发明轮子呢?如果你的用例看起来很臃肿,为什么不使用 aiohttp 中提供的非阻塞请求工具,使用 python 3.* async/await 语法呢?

【讨论】:

  • 受限于两件事:我们从 ArcGIS 获得 Python 2.7,除了标准模块之外,我们不能导入任何其他模块。工作限制糟透了!但是,我正在查看 multiprocessing.Pool 方法来尝试一下。
  • 如果您只是获取 url,则需要多线程,只需使用 ThreadPoolExecutor。产生 350 个进程对于一堆 I/O 绑定的工作听起来并不实用。
  • 通过“获取”我们将转到 URL,并从 20-65MB 的文件中下载任何地方。多线程是要走的路吗?
  • @pasta_sauce 除非您还在线程中对这些文件进行一些重要的处理,否则我会说是的。下载基本上是在等待
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多