广告
返回顶部
首页 > 资讯 > 后端开发 > Python >多线程编程(3):线程池ThreadPo
  • 865
分享到

多线程编程(3):线程池ThreadPo

线程多线程ThreadPo 2023-01-31 07:01:37 865人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在内部使用对象池来处理这种情况,以提高性能

面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在内部使用对象池来处理这种情况,以提高性能,比如在ADO.net内部就允许使用数据库连接池来提高性能,在JDBC中没有提供数据库连接池,一些开发人员为了提高效率就自己编写数据库连接池来提高性能,当然据我所知在Java中有些框架提供了数据库连接的池化处理。
多线程编程时也会遇到上面的情况,如果创建了过多的线程将会增加操作系统资源的占用,并且还要处理资源要求和潜在的占用冲突,并且使用了多线程之后将使代码的执行流程和资源竞争情况变得复杂,稍不留心就会产生bug(在第二篇中在我写的代码中就曾经出现过一个bug,后来我自己发现并处理了这个bug)。在使用多线程编程时对需要同步的资源访问尤其需要注意,如系统资源(系统端口等)、共享资源(文件、窗口句柄等)、属于单个应用程序的资源(如全局、静态和实例字段或属性)。
针对上面的情况,我们可以使用线程池来解决上面的大部分问题,跟使用单个线程相比,使用线程池有如下优点:
1、缩短应用程序的响应时间。因为在线程池中有线程的线程处于等待分配任务状态(只要没有超过线程池的最大上限),无需创建线程。
2、不必管理和维护生存周期短暂的线程,不用在创建时为其分配资源,在其执行完任务之后释放资源。
3、线程池会根据当前系统特点对池内的线程进行优化处理。
总之使用线程池的作用就是减少创建和销毁线程的系统开销。在.NET中有一个线程的类ThreadPool,它提供了线程池的管理。
ThreadPool是一个静态类,它没有构造函数,对外提供的函数也全部是静态的。其中有一个QueueUserWorkItem方法,它有两种重载形式,如下:
public static bool QueueUserWorkItem(WaitCallback callBack):将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
public static bool QueueUserWorkItem(WaitCallback callBack,Object state):将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
QueueUserWorkItem方法中使用的的WaitCallback参数表示一个delegate,它的声明如下:
public delegate void WaitCallback(Object state)
如果需要传递任务信息可以利用WaitCallback中的state参数,类似于ParameterizedThreadStart委托。
下面是一个ThreadPool的例子,代码如下:
 
using System.Threading;
using System.Collections;
using System.Diagnostics;
using System;
using System.ComponentModel;

namespace ThreadPoolDemo
{
        class ThreadPoolDemo1
        {
                public ThreadPoolDemo1()
                {
                }

                public void Work()
                {
                        ThreadPool.QueueUserWorkItem(new WaitCallback(CountProcess));
                        ThreadPool.QueueUserWorkItem(new WaitCallback(GetEnvironmentVariables));
                }
                /// <summary>
                /// 统计当前正在运行的系统进程信息
                /// </summary>
                /// <param name="state"></param>
                private void CountProcess(object state)
                {
                        Process[] processes = Process.GetProcesses();
                        foreach (Process p in processes)
                        {
                                try
                                {
                                        Console.WriteLine("Id:{0},ProcessName:{1},StartTime:{2}", p.Id, p.ProcessName, p.StartTime);
                                }
                                catch (Win32Exception e)
                                {
                                        Console.WriteLine("ProcessName:{0}", p.ProcessName);
                                }
                                finally
                                {
                                }
                        }
                        Console.WriteLine("获取进程信息完毕。");
                }
                /// <summary>
                /// 获取当前机器系统变量设置
                /// </summary>
                /// <param name="state"></param>
                public void GetEnvironmentVariables(object state)
                {
                        IDictionary list=System.Environment.GetEnvironmentVariables();
                        foreach (DictionaryEntry item in list)
                        {
                                Console.WriteLine("key={0},value={1}", item.Key, item.Value);
                        }
                        Console.WriteLine("获取系统变量信息完毕。");
                }

  static void Main(string[] args)
                {
                        ThreadPoolDemo1 tpd1 = new ThreadPoolDemo1();
                        tpd1.Work();
                        Thread.Sleep(5000);

                        Console.WriteLine("OK");

                        Console.ReadLine();
                }
        }
}

--结束END--

本文标题: 多线程编程(3):线程池ThreadPo

本文链接: https://www.lsjlt.com/news/191975.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 多线程编程(3):线程池ThreadPo
    在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在内部使用对象池来处理这种情况,以提高性能...
    99+
    2023-01-31
    线程 多线程 ThreadPo
  • python 多线程模块threadpo
      python实现线程池通常使用threading或thread模块来编写,现在已经有了threadpool模块来实现线程池。英文文档见:http://www.chrisarndt.de/projects/threadpool/中文文档见...
    99+
    2023-01-31
    多线程 模块 python
  • python多线程————3、多线程间通
    1、共享变量 #通过共享变量 import time import threading url_list = [] def get_detail_html(): global url_list while True: ...
    99+
    2023-01-31
    多线程 python
  • 多线程案例(4)-线程池
    文章目录 多线程案例四四、线程池 大家好,我是晓星航。今天为大家带来的是 多线程案例-线程池 相关的讲解!😀 多线程案例四 四、线程池 线程池是什么 虽然创建线程 / 销毁线程 的开销 想象这么一个场景: ...
    99+
    2023-08-19
    java 开发语言 java-ee 多线程
  • C#多线程之线程池(ThreadPool)
    一、简介 前面介绍了平时用到的大多数的多线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上来讲,这样做并不理想(因为每使用一个线程...
    99+
    2022-11-13
  • C#多线程系列之线程池
    目录线程池ThreadPool 常用属性和方法线程池说明和示例线程池线程数线程池线程数说明不支持的线程池异步委托任务取消功能计时器线程池 线程池全称为托管线程池,线程池受 .NET ...
    99+
    2022-11-13
  • Java多线程案例之线程池
    文章目录 一. 线程池概述1. 什么是线程池2. Java标准库提供的线程池 二. 线程池的简单实现 一. 线程池概述 1. 什么是线程池 线程池和和字符串常量池, 数据库连接池一样,...
    99+
    2023-09-04
    java 线程池 多线程
  • C#多线程之线程池ThreadPool详解
    一、ThreadPool概述 提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。 创建线程需要时间。如果有不同的小任务要完成,就可...
    99+
    2022-11-13
  • C#多线程之线程池ThreadPool用法
    目录一、ThreadPool1、QueueUserWorkItem()2、GetMaxThreads()3、GetMinThreads()4、SetMaxThreads()和SetM...
    99+
    2022-11-13
  • 自学多线程-3
    中断线程的运行: 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它。 代码示例如下: class Kirl implements Runnable  {      public void pri...
    99+
    2023-01-31
    多线程
  • Python多线程编程,线程锁
    多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁@需要了解!!!   什么是线程? 线程也是一种多任务的编程方法,可以利用计算机多核资源完成程序的并发运行。 线程又被称为轻量级进程 ...
    99+
    2023-01-30
    线程 多线程 Python
  • Python并发编程之线程池/进程池
    原文来自开源中国前言python标准库提供线程和多处理模块来编写相应的多线程/多进程代码,但当项目达到一定规模时,频繁地创建/销毁进程或线程是非常消耗资源的,此时我们必须编写自己的线程池/进程池来交换时间空间。但是从Python3.2开始,...
    99+
    2023-06-02
  • Java多线程与线程池技术分享
    目录一、序言1、普通执行2、线程池执行二、线程池基础1、核心参数2、参数与池的关系1、通用对比2、拓展对比3、无返回值任务4、有返回值任务三、Executors1、创建单一线程的线程...
    99+
    2022-11-13
  • Java多线程 自定义线程池详情
    主要介绍: 1.任务队列 2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列) 3.init( min ) 4.active 5.max ...
    99+
    2022-11-12
  • Android的线程、多线程和线程池面试题有哪些
    这篇“Android的线程、多线程和线程池面试题有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android的线程、多...
    99+
    2023-06-04
  • java怎么使用线程池启动多线程
    在 Java 中,可以使用线程池来启动多线程。以下是使用线程池启动多线程的示例代码:首先,需要导入 `java.util.concu...
    99+
    2023-09-15
    java
  • Java 多线程编程
    Java 多线程编程   目录 Java 多线程编程 一个线程的生命周 线程的优先级 创建一个线程 通过实现Runnable接口来创建线程 实例 通过继承Thread来创建线程 实例 Thread 方法 实例   线程的几个主要概念: 多线...
    99+
    2023-10-20
    python 开发语言
  • python3 多线程编程
    0.什么是线程 多线程模块 创建线程的方法 join()方法 4.isAlive()方法 name属性和daemon属性 6.线程的同步---锁 7.线程的同步---Event对象 8.线程的同步---Condition条件...
    99+
    2023-01-31
    多线程
  • Python多线程编程
      一个串行程序需要从每个I/O终端通道来检测用户的输入,然而程序在读取过程中不能阻塞,因为用户输入的到达时间的不确定,并且阻塞会妨碍其他I/O通道的处理。由于串行程序只有唯一的执行线程,因此它需要兼顾执行的多个任务,确保其中的某个任务不会...
    99+
    2023-01-31
    多线程 Python
  • python 多线程编程
    使用回调方式 import time def countdown(n): while n > 0: print('T-minus', n) n -= 1 time.sleep...
    99+
    2023-01-31
    多线程 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作