我正在尝试解决一个问题,我有很多(大约一万个)URL,并且需要从所有URL下载内容。到目前为止,我一直在“for link in links:”循环中执行此操作,但现在所花费的时间太长了。我认为是时候实现多线程或多处理方法了。我的问题是,最好的方法是什么?
我知道全局解释器锁,但由于我的问题是网络限制,而不是 CPU 限制,所以我认为这不会成为问题。我需要将数据从每个线程/进程传递回主线程/进程。我不需要帮助实施任何方法(当任何线程完成任务时终止多个线程涵盖这一点),我需要关于采取哪种方法的建议。我目前的做法:
data_list = get_data(...)
output = []
for datum in data:
output.append(get_URL_data(datum))
return output
没有其他共享状态。
我认为最好的方法是拥有一个包含所有数据的队列,并让多个工作线程从输入队列中弹出,获取 URL 数据,然后推送到输出队列。
我对吗?我有什么遗漏的吗?这是我第一次用任何语言实现多线程代码,我知道这通常是一个难题。
对于您的具体任务,我会推荐一个多处理工作池。您只需定义一个池并告诉它您想要使用多少个进程(默认情况下每个处理器核心一个)以及您想要在每个工作单元上运行的函数。然后你准备好每一个工作单元(在您的情况下,这将是一个 URL 列表)放在列表中并将其提供给工作池。
您的输出将是原始数组中每个工作项的工作函数的返回值列表。所有很酷的多处理功能都将在后台发生。当然还有其他使用工作池的方法,但这是我最喜欢的一种。
快乐的多重处理!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)