在Python中使用多个线程

Bre*_*own 3 python multithreading

我正在尝试解决一个问题,我有很多(大约一万个)URL,需要从所有这些网站下载内容.我一直这样做是为了"链接中的链接:"循环到现在为止,但现在花费的时间太长了.我认为是时候实现多线程或多处理方法了.我的问题是,最好的方法是什么?

我知道全局解释器锁,但由于我的问题是网络限制,而不是CPU限制,我认为这不会是一个问题.我需要将数据从每个线程/进程传回主线程/进程.我不需要帮助实现任何方法(当任何线程完成任务时终止多个线程),我需要建议采取哪种方法.我目前的做法:

data_list = get_data(...)
output = []
for datum in data:
    output.append(get_URL_data(datum))
return output
Run Code Online (Sandbox Code Playgroud)

没有其他共享状态.

我认为最好的方法是拥有一个包含所有数据的队列,并从输入队列中弹出几个工作线程,获取URL数据,然后推送到输出队列.

我对吗?有什么我想念的吗?这是我第一次用任何语言实现多线程代码,我知道这通常是一个难题.

Hub*_*bro 5

对于您的特定任务,我建议使用多处理工作池.您只需定义一个池并告诉它您要使用多少个进程(默认情况下每个处理器核心一个)以及您希望在每个工作单元上运行的函数.然后,您准备好每个工作单元(在您的情况下,这将是一个URL列表)并将其提供给工作池.

您的输出将是原始数组中每个工作项的工作函数的返回值列表.所有酷炫的多处理优点都将在后台进行.当然还有其他与工作人员合作的方式,但这是我最喜欢的方式.

快乐多处理!

  • 我认为多处理模块已经提供了一个(半隐藏的)ThreadPool类:http://stackoverflow.com/questions/3033952/python-thread-pool-similar-to-the-multiprocessing-pool (2认同)