Python 线程池 threadpool

本贴最后更新于 2201 天前,其中的信息可能已经物是人非

最近在试用 python 抓取一些新闻,用到了多线程模块,记录下来分享下;

不使用多进程是觉得多进程占用资源,爬虫模块限制占用资源,力求快速,因此使用了 python 的线程池

python 多线程

多线程可以使程序同时执行多个事件,提高 CPU 的利用率,节省多个任务的执行事件;

在 python 中,主要用

  1. multiprocessing.pool 多进程多线程
  2. threadpool 多线程
    这两个模块来实现线程池

线程池 threadpool

线程池与线程的区别就是,线程池是提前创建固定的线程数量,超过线程数量就会等待;而线程是根据需求创建线程,创建的数量是由系统决定的;

一、安装

安装 python-pip,然后使用 pip 安装;安装后测试是否安装成功

pip install threadpool
python -c "import threadpool" # 测试是否安装成功,无输出则成功,否则失败

二、代码实例

Talk is cheap, show me the code.
先上一段代码,自己体会;

import time
import threadpool

def worker(params1, params2):
   time.sleep(2)
   print("hello world", params1, params2)


def test_pool():
   pool = threadpool.ThreadPool(5)
   nums_tasks = 10
   for i in range(nums_tasks):
      # requests = threadpool.makeRequests(worker, [([i, i + 1], {})])  # 参数传递,遵循python参数解包
      requests = threadpool.makeRequests(worker, [([], {"params1": i, "params2": i + 1})])
      pool.putRequest(requests)
   pool.wait()
	 
	 
if __name__ == '__main__':
    test_pool()

在 test_pool 中,首先创建一个拥有 5 个线程的线程池,在 for 循环中,通过 threadpool.makeRequests,构建线程池请求任务,特别注意参数传递的方式;
threadpool.makeRequests 的参数是一个 tuple,第一个为 list,依次对应参数的第一个、第二个...;第二个为 dict,传参 key=value 的格式;不可重复传递参数,也不能少传递参数;
最后通过 pool.putRequest 将任务丢到线程池执行;pool.wait 等待所有线程结束;

多线程 multiprocessing

multiprocessing 是 python 的标准库,多进程,多线程都支持

代码实例

import time
from multiprocessing.pool import ThreadPool

def worker(params1, params2):
   time.sleep(2)
   print("hello world", params1, params2)


def test_pool():
   pool = ThreadPool(5)
   nums_tasks = 10
   for i in range(nums_tasks):
      pool.apply_async(worker, (i, i + 1))
   pool.close()
   pool.join()
	 
	 
if __name__ == '__main__':
    test_pool()

multiprocessing 的使用要简单一点,只需要创建线程池,执行线程,传递参数;
最后都需要调用 pool.close 才可以 join,否则报错 ---- 疑问?

执行上述代码,发现比串行快了许多;达到最终效果;

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    545 引用 • 672 回帖
  • 线程
    122 引用 • 111 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zl158218

    大佬威武,😋

  • XPPA

    "多线程可以使程序同时执行多个事件;"这句话有问题吧 😄。python 的多线程实际上同时只能有一个线程在运行,当某个线程阻塞住的时候他会切换到其他线程上去执行,看起来像是并发了,实际上还是只有一个在跑。