python - 在 Python 中使用多线程

标签 python multithreading

我正在尝试解决一个问题,我有很多(大约一万个)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/

相关文章:

python - PrettyPrint python 成一个字符串,而不是标准输出

python - DJANGO_SETTINGS_MODULE envar 未设置

python - 使用 toPandas() 和 databricks 连接时遇到 'java.lang.OutOfMemoryError: Java heap space'

python - type.__setattr__ 与 object.__setattr__ 有何不同?

java - 线程卡在锁上的成本

multithreading - 主线程在基于线程池/任务的应用程序中做什么?

java - 在 App Engine Java 开发服务器中,如何模拟并发线程以确保安全?

python - HashMap 使用 hash() 方法

c++ - 将相同的值写入相同的内存位置会导致数据竞争吗?

ios - 处理核心数据中的大量删除/插入