python_并发编程——线程池

1.线程池

import time
from concurrent.futures import ThreadPoolExecutor

def func(n):
    time.sleep(2)
    print(n)

t_pool = ThreadPoolExecutor(max_workers=5)  # 创建线程池对象,设置线程池大小,建议不超过cpu数*5
for i in range(20):
    t_pool.submit(func,i)    # 启动进程池,(执行的函数,传递的参数)

结果:每过两秒钟随机打印5个数。

import time
from concurrent.futures import ThreadPoolExecutor

def func(n):
    time.sleep(2)
    print(n)

t_pool = ThreadPoolExecutor(max_workers=5)  # 创建线程池对象,设置线程池大小,建议不超过cpu数*5
for i in range(20):
    t_pool.submit(func,i)    # 启动进程池,(执行的函数,传递的参数)
t_pool.shutdown()  # 线程池被执行完,才会执行主线程的内容。
print(‘主线程!‘)

结果:

2.取出线程池中函数的返回值

from concurrent.futures import ThreadPoolExecutor

def func(n):
    return n*n

t_pool = ThreadPoolExecutor(max_workers=5)  # 创建线程池对象,设置线程池大小,建议不超过cpu数*5
t_list = []
for i in range(20):
    # 接收进程池的返回值
    t = t_pool.submit(func,i)
    # 将返回值添加进列表
    t_list.append(t)
t_pool.shutdown()  # 线程池被执行完,才会执行主线程的内容。
print(‘主线程!‘)
for i in t_list:
    print(i.result())  # 用result方法,打印列表中的值

结果:

 3.进程池

  导入ProcessPoolExecutor模块,方法和线程池一样。

4.map()方法:

from concurrent.futures import ThreadPoolExecutor
import time

def func(n):
    time.sleep(2)
    print(n)

t_pool = ThreadPoolExecutor(max_workers=5)  # 创建线程池对象,设置线程池大小,建议不超过cpu数*5
t_pool.map(func,range(20))    # 启动进程池,(执行的函数,传递的参数(可迭代的))

结果:每过两秒钟随机打印5个数。map方法无法拿到函数的返回值。

5.回调函数

from concurrent.futures import ThreadPoolExecutor

def func(n):
    return n*n

def call_back(m):
    print(‘回调函数:‘,m.result())  # m是一个对象,需要用result方法,才能得到值

t_pool = ThreadPoolExecutor(max_workers=5)
t_pool.submit(func,5).add_done_callback(call_back)  # 回调函数(回调函数的函数名)

结果:

原文地址:https://www.cnblogs.com/wangdianchao/p/12141665.html

时间: 2024-10-09 06:08:21

python_并发编程——线程池的相关文章

17.并发编程--线程池

并发编程线程池 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行. 第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 1. Executor 框架简介 在 Java 5 之后,并发编程引入了一堆新的启动.调度和管理 线

java之并发编程线程池的学习

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类. corePoolSize在很多地方被翻译成核心池大小,其实我的理解这个就是线程池的大小.举个简单的例子: 假如有一个工厂,工厂里面有10个工人,每个工人同时只能做一件任务. 因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做:

Java并发编程——线程池的使用

在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,

JAVA 并发编程-线程池(七)

线程池的作用: 线程池作用就是限制系统中运行线程的数量. 依据系统的环境情况.能够自己主动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其它线程排队等候.一个任务运行完毕,再从队列的中取最前面的任务開始运行. 为什么要用线程池: 1.降低了创建和销毁线程的次数,每一个工作线程都能够被反复利用.可运行多个任务. 2.能够依据系统的承受能力,调整线程池中工作线线程的数目,防止由于消耗过多的内存,而把server累趴下 Java里面线程池的

java并发编程-线程池的使用

参考文章:http://www.cnblogs.com/dolphin0520/p/3932921.html 深入剖析线程池实现原理 将从下面几个方面讲解: 1.线程池状态 2.任务的执行 3.线程池中的线程初始化 4.任务缓存队列及排队策略 5.任务拒绝策略 6.线程池的关闭 7.线程池容量的动态调整 1.线程池状态 在ThreadPoolExcutor中定义了一个volatile变量,另外定义了几个static final变量表示线程池的各个状态: volatile int runState

Java并发编程——线程池初步

概述: 线程池机制是事先创建一些线程等待服务端程序的调用,这些线程保存在一个数组结构中,称为"线程池".当服务器有任务执行时,就从线程池中取出一个线程并给其分配任务,当线程任务执行完成后,再被放回线程池中. 优点: 1. 由于在任务到达之前,线程已经存在,所以这里为系统消除了线程创建的资源和时间的开销.可以立即为请求服务,使程序响应更快. 2. 通过适当地调节线程池中的线程数目,就强制使一些新到的任务处于等待状态,可以防止资源不足. 参考: http://www.cnblogs.com

Java并发编程——线程池

一.Java中的ThreadPoolExecutor类 二.深入剖析线程池实现原理 三.使用示例 四.如何合理配置线程池的大小 一.Java中的ThreadPoolExecutor类 java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类.下面我们来看一下ThreadPoolExecutor类的具体实现源码. 在ThreadPoolExecutor类中提供了四个构造方法: public c

并发编程--线程池与进程池

核心思想 以时间换空间 进程池 进程池:一个容器,这个容器限制住你开启进程的数量,默认是os.cpu_count(),我的电脑是8核,所以能开启8个,第一次肯定只能并行的处理8个任务,只要有任务完成,进程马上就会接下一个任务. 代码实现: from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import os,time,random # print(os.cpu_count()) def task(n): p

python_并发编程——进程池

1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '__main__': pool = Pool(3) #启动有三个进程的进程池. #第一个参数进程要访问的代码,第二个参数必须是一个可迭代参数,规定了要执行的任务数 pool.map(func,range(100)) #100个任务 结果: 每个数打印了10次. 2.进程池和多进程的用时对比 def f