首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行许多I/O受限操作时,如何在Python中实现性能最大化?

在执行许多I/O受限操作时,如何在Python中实现性能最大化?
EN

Stack Overflow用户
提问于 2010-06-04 11:46:37
回答 4查看 5K关注 0票数 10

我有一种情况,我下载了很多文件。现在一切都运行在一个Python主线程上,每隔几分钟就会下载多达3000个文件。问题是这样做所需的时间太长了。我知道Python没有真正的多线程,但是有没有更好的方法呢?我在考虑启动多线程,因为I/O限制的操作不应该需要访问全局解释器锁,但可能我误解了这个概念。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-04 11:51:52

可以随时查看一下multiprocessing

票数 5
EN

Stack Overflow用户

发布于 2010-06-04 12:08:17

多线程对于加速网络上的I/O的特定目的来说是很好的(尽管异步编程会提供更好的性能)。CPython的多线程是非常“真实”的(原生OS线程) --您可能想到的是GIL,它是一个全局解释器锁,可以阻止不同的线程同时运行Python代码。但是所有的I/O原语在等待系统调用完成时都会放弃GIL,所以GIL与I/O性能无关!

对于异步编程,最强大的框架是twisted,但如果您从未进行过此类编程,可能需要一段时间才能掌握它。对于您来说,通过使用线程池获得额外的I/O性能可能更简单。

票数 16
EN

Stack Overflow用户

发布于 2010-06-04 23:02:19

有没有更好的方法来做这件事?

我正在考虑启动多个线程,因为I/O绑定操作

别。

在操作系统级别,进程中的所有线程共享一组有限的I/O资源。

如果你想要真正的速度,产生尽可能多的重量级操作系统进程,因为你的平台可以容忍。该操作系统在平衡进程间的I/O工作负载方面做得非常好。让操作系统解决这个问题。

人们会说产生3000个进程是不好的,他们是对的。你可能一次只想产生几百个。

you really想要的是以下内容。

  1. 将3000个URI排入队列的共享消息队列。
  2. 数百个工作进程,它们都在从队列中读取数据。

每个工作者从队列中获取URI并获取文件。

工人们可以继续工作。当队列空了的时候,他们就会坐在那里,等待工作。

“每隔几分钟”,您将3000个URI转储到队列中,以使工作人员开始工作。

这将占用处理器上的所有资源,而且这是相当微不足道的。每个worker只有几行代码。加载队列是一个特殊的“管理器”,也只需要几行代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2971381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档