Python探索之自定义实现线程池

yizhihongxing

Python探索之自定义实现线程池

什么是线程池?

线程池是一种线程管理的方法,它可限制线程的数量,避免线程过多消耗过多的系统资源,提供对线程的增加、删除等操作进行优化,以提升系统性能。

自定义线程池的实现

Step 1:导入所需模块

import threading
import queue

Step 2:定义线程池类

class ThreadPool:
    def __init__(self, size):
        self.size = size
        self.tasks = queue.Queue()
        self.threads = []
        self.is_closed = False
        self.__create_threads()

    def __create_threads(self):
        for i in range(self.size):
            thread = threading.Thread(target=self.__worker, name='pool_thread_{}'.format(i))
            thread.start()
            self.threads.append(thread)

    def __worker(self):
        while True:
            try:
                if self.is_closed:
                    break
                task = self.tasks.get(block=True, timeout=1)
                task()
                self.tasks.task_done()
            except queue.Empty:
                pass

    def add_task(self, task):
        if self.is_closed:
            raise ValueError('ThreadPool is already closed.')
        self.tasks.put(task)

    def close(self):
        self.is_closed = True
        for thread in self.threads:
            thread.join()

Step 3:使用自定义线程池

def task1():
    print('Task 1 executing...')

def task2():
    print('Task 2 executing...')

pool = ThreadPool(5)
pool.add_task(task1)
pool.add_task(task2)
pool.close()

示例说明

示例 1:计算斐波那契数列

使用自定义线程池计算斐波那契数列,代码如下:

def fibonacci(n):
    if n == 0 or n == 1:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)

def print_fibonacci(n):
    print('Fibonacci({})={}'.format(n, fibonacci(n)))

pool = ThreadPool(5)
for i in range(35, 41):
    pool.add_task(lambda: print_fibonacci(i))
pool.close()

运行结果:

Fibonacci(35)=14930352
Fibonacci(37)=24157817
Fibonacci(39)=63245986
Fibonacci(36)=9227465
Fibonacci(38)=39088169
Fibonacci(40)=102334155

示例 2:爬取网站数据

使用自定义线程池爬取网站数据,代码如下:

import requests
import re

def download(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
    except Exception as e:
        print('Error: ', e)

def crawl(url):
    html = download(url)
    if html is None:
        return
    pattern = '<title>(.*?)</title>'
    title = re.findall(pattern, html, re.IGNORECASE)
    if title:
        print('{}: {}'.format(url, title[0]))

pool = ThreadPool(5)
urls = ['https://cn.bing.com/', 'https://www.sogou.com/', 'https://www.baidu.com/', 'https://www.hao123.com/', 'https://www.163.com/']
for url in urls:
    pool.add_task(lambda: crawl(url))
pool.close()

运行结果:

https://www.163.com/: 网易
https://www.sogou.com/: 搜狗搜索引擎 - 上网从搜狗开始
https://www.baidu.com/: 百度一下,你就知道
https://cn.bing.com/: Bing
https://www.hao123.com/: hao123上网导航-用最简单的方式让你上网更方便!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python探索之自定义实现线程池 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python实现三种随机请求头方式

    以下是关于“Python 实现三种随机请求头方式”的完整攻略: Python 实现三种随机请求头方式 在进行爬虫或接口测试时,为了避免被网站识别为机器人,我们需要使用随机请求头。Python 可以通过三种方式实现随机请求头,分别是使用 fake_useragent 库、使用 random 库和使用自定义函数。以下是 Python 实现三种随机请求头方式的详细…

    python 2023年5月15日
    00
  • Python Flask 请求数据获取响应详解

    Python Flask请求数据获取响应详解 什么是 Python Flask Python Flask 是一个轻量级的 Web 应用框架。它的设计原则是让开发 Web 应用变得简单和快速。Flask 的核心是 WSGI 工具箱,它负责管理 Flask 的请求和响应。Flask 还提供了一些有用的扩展功能,方便我们处理数据和连接到数据库服务器等。 Flask…

    python 2023年5月14日
    00
  • python中Requests请求的安装与常见用法

    以下是关于Python中Requests请求的安装与常见用法的攻略: Python中Requests请求的安装与常见用法 安装Requests 在使用Requests之前,需要先安装它。可以使用pip命令来安装Requests: pip install requests 发送HTTP请求 使用Requests发送HTTP请求非常简单。以下是使用Request…

    python 2023年5月14日
    00
  • python条件变量之生产者与消费者操作实例分析

    我来详细讲解一下“Python条件变量之生产者与消费者操作实例分析”的完整攻略。 什么是条件变量? 条件变量是具备通知机制的锁,可以用于多个线程之间的协调。在多线程编程中,常常需要等待某个条件成立才可以继续执行,条件变量可以用来等待和通知。 生产者与消费者模型 生产者与消费者模型是一种常见的多线程模型,其中生产者负责生成某种东西并将其放入共享资源,而消费者则…

    python 2023年6月6日
    00
  • 利用Python抓取阿里云盘资源

    利用Python抓取阿里云盘资源攻略 阿里云盘是一款云存储服务,用户可以将文件上传到阿里云盘中进行存储和管理。本攻略将介绍如何使用Python抓取阿里云盘资源的完整攻略,包括登录、获取文件列表、下载文件等操作。 步骤1:登录阿里云盘 在Python中,我们可以使用selenium库模拟浏览器登录阿里云盘。以下是登录阿里云盘的示例代码: from seleni…

    python 2023年5月15日
    00
  • python实现带声音的摩斯码翻译实现方法

    Python实现带声音的摩斯码翻译实现方法 本文将介绍Python如何实现带声音的摩斯码翻译。使用摩斯码是一种常见的编码方式,用于传输文本信息。在本文中,将通过Python编程语言实现用户输入文本转换为摩斯码的过程,并将其转换为声音输出。 实现步骤 步骤1:定义摩斯码表 摩斯码表是将字符转换为摩斯码序列的关键所在。我们首先需要定义一个包含英文字母、数字和符号…

    python 2023年6月5日
    00
  • Python使用Beautiful Soup(BS4)库解析HTML和XML

    Python使用BeautifulSoup(BS4)库解析HTML和XML 在本文中,我们将介绍如何使用Python的BeautifulSoup库解析HTML和XML。我们将使用BeautifulSoup库来解析HTML和XML文档,并提取其中的数据。 步骤1:安装BeautifulSoup库 在使用BeautifulSoup库之前,我们需要先安装它。以下是…

    python 2023年5月15日
    00
  • python实现可以断点续传和并发的ftp程序

    下面是 Python 实现可以断点续传和并发的 FTP 程序的完整攻略: 1. 确认 FTP 服务器地址和端口 在开始编写 Python 脚本之前,需要确认需要连接的 FTP 服务器地址和端口。可以通过访问 FTP 服务器的网页或者询问管理人员来获取这些信息。 2. 安装 Python FTP 包 Python 自带的 ftplib 库提供了很好的 FTP …

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部