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日

相关文章

  • Python3.7安装PyQt5 运行配置Pycharm的详细教程

    下面是安装PyQt5并配置PyCharm的详细步骤: 1. 安装Python3.7 首先,你需要在你的电脑上安装Python3.7。你可以在Python官网(https://www.python.org/downloads/)下载最新的Python3.7版本的安装程序,并按照提示进行安装。 2. 利用pip安装PyQt5 在安装完Python3.7后,你需要…

    python 2023年5月18日
    00
  • python3+PyQt5+Qt Designer实现界面可视化

    下面是Python3+PyQt5+Qt Designer实现界面可视化的完整攻略: 1. 安装PyQt5和Qt Designer 在开始之前,需要先安装PyQt5和Qt Designer。如果你使用的是pip,可以直接在终端中运行下面的命令进行安装: pip3 install PyQt5 pyqt5-tools 如果你使用的是Anaconda,可以在Anac…

    python 2023年6月13日
    00
  • Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现

    Python作为一门编程语言,有多种运行方式,其中包括命令行窗口、Python解释器、IDLE等。 命令行窗口 命令行窗口是最简单的运行Python程序的方式,它打开后,我们可以输入Python命令,直接执行Python代码。 示例 打开命令行窗口,输入以下代码: print("Hello, world!") 按回车键,我们会看到屏幕上输…

    python 2023年5月19日
    00
  • Python解析json代码实例解析

    下面我将详细讲解“Python解析json代码实例解析”的完整攻略。 前言 在Web开发中,JSON作为一种轻量级的数据交换格式,已经被广泛应用。Python作为一门优秀的编程语言,提供了许多强大的库来解析JSON,如:json、jsonpickle、simplejson等。本文将以json库为例,介绍如何在Python中解析JSON数据。 安装json库 …

    python 2023年5月13日
    00
  • python urllib.request模块的使用详解

    Python urllib.request 模块的使用详解 Python 的 urllib.request 模块是 Python 自带的 HTTP 请求库,可以用于发送 HTTP 请求。本文将详细介绍 urllib.request 模块的使用方法。 发送 GET 请求 使用 urllib.request 模块发送 GET 请求非常简单,只需要调用 urlop…

    python 2023年5月15日
    00
  • 利用Python如何生成随机密码

    生成随机密码可以通过Python中的random模块实现。下面是详细的步骤: 1. 导入random模块 首先需要在Python脚本中导入random模块,用于生成随机数、随机字符串。 import random 2. 指定密码长度和可能字符集 通过random模块生成的随机数,拼接起来即可获得随机密码。为了具有一定的安全性,需要指定密码长度,并且指定包含哪…

    python 2023年6月3日
    00
  • 浅谈Python 函数式编程

    浅谈Python函数式编程 函数式编程是一种编程范式,它将计算机运算看作是函数之间的数学关系,避免了状态和可变数据的使用,允许并行化和更容易进行错误检测和调试。Python可以编写函数式程序,以下是有关Python函数式编程的完整攻略。 Lambda表达式 Lambda表达式是Python函数式编程的基础知识。Lambda表达式是一个匿名函数,只包含单个语句…

    python 2023年6月5日
    00
  • 查找列表中每个项目的 Python NLTK Wordnet Synsets

    【问题标题】:Find Python NLTK Wordnet Synsets for a each item of a list查找列表中每个项目的 Python NLTK Wordnet Synsets 【发布时间】:2023-04-07 03:26:02 【问题描述】: 我一直在学习基本的 python,但我是 NLTK 的新手。我想使用 nltk 为…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部