Python线程池使用

背景

多线程不能利用CPU多核优势,IO密集型可用多线程,CPU密集型适合用多进程。在采用多线程的时候就无需手动根据任务数量来创建线程,而是在建立线程池之后,不断地对线程池中空闲线程进行任务的分配。
使用线程池的主要优点:
(1)可以控制产生线程的数量。通过预先创建一定数量的工作线程并限制其数量,控制线程对象的内存消耗。
(2)降低系统开销和资源消耗。通过对多个请求重用线程,线程创建、销毁的开销被分摊到了多个请求上。另外通过限制线程数量,降低虚拟机在垃圾回收方面的开销。
(3)提高系统响应速度。线程事先已被创建,请求到达时可直接进行处理,消除了因线程创建所带来的延迟,另外多个线程可并发处理。

代码

threadpool需要单独安装:pip install threadpool
采用线程池方式1:

# -*- coding: utf-8 -*-
__author__ = 'jason'
import time
import threadpool
from multiprocessing.dummy import Pool as ThreadPool

import multiprocessing
max_cpu = multiprocessing.cpu_count()
time1 = time.time()
print('max_cpu=%d' % max_cpu)

def long_op(n):
    print('%d\n' % n)
    time.sleep(10)

pool = threadpool.ThreadPool(10)#创建线程池
my_task = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
tasks = threadpool.makeRequests(long_op, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])#数组表示任务,本处有10个task
print('task num:',len(tasks))

[pool.putRequest(req) for req in tasks]#将任务放到线程池中
pool.wait()
time2 = time.time()
print(time2 - time1)

输出结果的显示并一定是成对的,这是因为sleep的时间产生的。但是总体的时间是耗时可以看出是并行处理的。总体耗时为10s,可以看出是每个线程都取了一个任务去做sleep操作了。
这里写图片描述
线程池方式2:
采用map的方式来分配任务。代码如下:

# -*- coding: utf-8 -*-
__author__ = 'jason'
import time
from multiprocessing.dummy import Pool as ThreadPool

import multiprocessing
max_cpu = multiprocessing.cpu_count()
time1 = time.time()
print('max_cpu=%d' % max_cpu)

def long_op(n):
    print('%d\n' % n)
    time.sleep(10)

my_task = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pool = ThreadPool(10)
results = pool.map(long_op, my_task)
pool.close()
pool.join()
print('task num:',len(my_task))
time2 = time.time()
print(time2 - time1)

运行结果如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值