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

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 中输出长篇文字时,使用三引号输出方法可以避免在每行文字的行末添加换行符,与普通字符串变量的定义方式有所不同。下面是使用三引号方式定义字符串变量的语法: variable_name = ”’ Long text here ”’ 其中 ”’ 表示三个连续的单引号,将所有文本包围在其中,可以在句首句尾包含换行符和缩进。下面进行更详…

    python 2023年5月20日
    00
  • Python数组并集交集补集代码实例

    针对“Python数组并集交集补集代码实例”,我可以为您提供以下的详细攻略: 确定两个数组 首先,我们需要确定两个数组,我们可以使用Python中的列表对象来代替数组。以下是两个示例列表: list1 = [1, 2, 3, 4, 5] list2 = [4, 5, 6, 7, 8] 数组并集 要获取两个数组的并集,我们可以使用Python中的set对象来进…

    python 2023年6月6日
    00
  • Python利用pip安装tar.gz格式的离线资源包

    下面是Python利用pip安装tar.gz格式的离线资源包的完整攻略: 1. 下载离线资源包并解压 首先需要下载对应版本的tar.gz格式的离线资源包,可以从官网或者第三方网站下载,这里以下载Django1.11.8版本的资源包为例。下载完成后将资源包解压到本地指定的文件夹中,注意要保留目录结构。 2. 安装pip 如果你还没有安装pip,需要先安装它。可…

    python 2023年5月14日
    00
  • python通过get,post方式发送http请求和接收http响应的方法

    要发送 HTTP 请求并获取响应,我们可以使用Python的标准库中的urllib或第三方的requests库。以下是Python中使用get和post方式发送 HTTP 请求的完整指南: 使用urllib库发送 HTTP 请求 1.发送GET请求并获取响应 import urllib.request url = ‘http://www.example.co…

    python 2023年5月20日
    00
  • python导入其他目录下模块的四种情况

    当我们在编写Python项目时,经常需要导入其他目录下的模块。这里介绍四种情况下Python导入其他目录下模块的方法。 1. 直接导入 当你需要导入一个和当前文件在同一级目录下的Python模块时,可以使用直接导入的方式。例如,如果你需要导入一个名为module.py的模块,该模块和当前文件在同一级目录下,那么可以使用以下的代码: import module…

    python 2023年6月3日
    00
  • 一文带你掌握Python中文词频统计

    一文带你掌握Python中文词频统计 介绍 针对中文的文本数据进行分析,通常需要进行中文分词以及词频统计。本文将通过Python编程实现中文词频统计的完整攻略。 分词工具 常用的分词工具有jieba、pkuseg等。本文以jieba作为分词工具 import jieba text = "今天是个好日子,天气非常的好" seg_list =…

    python 2023年5月13日
    00
  • 用python制作个论文下载器(图形化界面)

    制作论文下载器的完整攻略可以分为以下几个步骤: 步骤一:确定需求 在开始制作之前,我们需要确定自己的需求,考虑自己要做一个什么样的论文下载器。这个下载器需要具备哪些功能,需要考虑用户体验如何。 步骤二:安装依赖包 在制作下载器前,我们需要安装一些Python的依赖包,可以使用以下指令安装: pip install requests beautifulsoup…

    python 2023年6月13日
    00
  • Python 自动化表单提交实例代码

    让我来详细讲解如何使用 Python 实现自动化表单提交。 1. 安装所需库 首先,需要安装所需的 Python 库,包括 requests 和 Beautiful Soup 4。可以使用 pip 命令进行安装: pip install requests pip install beautifulsoup4 2. 获取表单页面的 URL 要想实现自动化表单提…

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