我正在尝试解决一个问题,我有很多(大约一万个)URL,并且需要从所有这些 URL 下载内容。到目前为止,我一直在“for link in links:”循环中执行此操作,但现在花费的时间太长了。我认为是时候实现多线程或多处理方法了。我的问题是,最好的方法是什么?
我知道全局解释器锁,但由于我的问题是网络限制,而不是 CPU 限制,我认为这不会成为问题。我需要将数据从每个线程/进程传回主线程/进程。我不需要帮助实现任何方法(Terminate multiple threads when any thread completes a task 涵盖了该方法),我需要关于采用哪种方法的建议。我目前的做法:
data_list = get_data(...)
output = []
for datum in data:
output.append(get_URL_data(datum))
return output
没有其他共享状态。
我认为最好的方法是拥有一个包含所有数据的队列,并从输入队列中弹出多个工作线程,获取 URL 数据,然后推送到输出队列。
我说的对吗?有什么我想念的吗?这是我第一次用任何语言实现多线程代码,我知道这通常是一个难题。
最佳答案
对于您的特定任务,我会推荐 multiprocessing worker pool .您只需定义一个池并告诉它您想要使用多少个进程(默认情况下每个处理器核心一个)以及您想要在每个工作单元上运行的功能。然后,您准备好列表中的每个工作单元(在您的情况下,这将是一个 URL 列表)并将其提供给工作池。
您的输出将是原始数组中每项工作的辅助函数返回值的列表。所有酷炫的多处理优势都将在后台发生。当然还有其他使用工作线程池的方法,但这是我最喜欢的一种。
愉快的多处理!
关于python - 在 Python 中使用多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638349/