我有一种情况,我下载了很多文件。现在一切都运行在一个Python主线程上,每隔几分钟就会下载多达3000个文件。问题是这样做所需的时间太长了。我知道Python没有真正的多线程,但是有没有更好的方法呢?我在考虑启动多线程,因为I/O限制的操作不应该需要访问全局解释器锁,但可能我误解了这个概念。
发布于 2010-06-04 11:51:52
可以随时查看一下multiprocessing。
发布于 2010-06-04 12:08:17
多线程对于加速网络上的I/O的特定目的来说是很好的(尽管异步编程会提供更好的性能)。CPython的多线程是非常“真实”的(原生OS线程) --您可能想到的是GIL,它是一个全局解释器锁,可以阻止不同的线程同时运行Python代码。但是所有的I/O原语在等待系统调用完成时都会放弃GIL,所以GIL与I/O性能无关!
对于异步编程,最强大的框架是twisted,但如果您从未进行过此类编程,可能需要一段时间才能掌握它。对于您来说,通过使用线程池获得额外的I/O性能可能更简单。
发布于 2010-06-04 23:02:19
有没有更好的方法来做这件事?
是
我正在考虑启动多个线程,因为I/O绑定操作
别。
在操作系统级别,进程中的所有线程共享一组有限的I/O资源。
如果你想要真正的速度,产生尽可能多的重量级操作系统进程,因为你的平台可以容忍。该操作系统在平衡进程间的I/O工作负载方面做得非常好。让操作系统解决这个问题。
人们会说产生3000个进程是不好的,他们是对的。你可能一次只想产生几百个。
you really想要的是以下内容。
每个工作者从队列中获取URI并获取文件。
工人们可以继续工作。当队列空了的时候,他们就会坐在那里,等待工作。
“每隔几分钟”,您将3000个URI转储到队列中,以使工作人员开始工作。
这将占用处理器上的所有资源,而且这是相当微不足道的。每个worker只有几行代码。加载队列是一个特殊的“管理器”,也只需要几行代码。
https://stackoverflow.com/questions/2971381
复制相似问题