下面是“Python线程池ThreadPool实现篇”的完整攻略。
线程池的概念
线程池是由多个线程构成的线程组。在实际应用中,使用线程池的好处是可以重用已创建的线程,减少创建和销毁线程的开销。线程池中包含一个任务队列和多个线程,任务队列中的任务可以由任意一个线程来执行,执行完成后线程并不会销毁,而是继续等待任务队列中的新任务。
Python的标准库threading并没有提供线程池的实现,但是我们可以使用第三方库threadpool实现线程池。
安装threadpool
首先需要安装threadpool库,可以使用pip命令进行安装:
pip install threadpool
使用threadpool创建线程池
下面是使用threadpool创建线程池的示例代码:
import threadpool
import time
def add(a, b):
print("%d + %d = %d" % (a, b, a+b))
time.sleep(1)
pool = threadpool.ThreadPool(2)
requests = threadpool.makeRequests(add, [(1,2),(3,4),(5,6)])
for req in requests:
pool.putRequest(req)
pool.wait()
首先导入threadpool库和time库,然后定义了一个add函数,该函数接收两个参数并打印出它们的和,然后暂停1秒钟模拟较长时间的操作。
接下来,使用ThreadPool类创建一个线程池pool,指定线程数为2。然后使用makeRequests函数创建了三个任务,每个任务接收两个参数并调用add函数进行计算。
最后,使用putRequest方法将任务添加到任务队列中,并调用wait方法等待所有任务完成。
线程池的优势
使用线程池的好处是可以重用已创建的线程,减少创建和销毁线程的开销。在下面的示例中,我们通过对比来说明线程池的优势。
import threadpool
import time
import datetime
def add(a, b):
print("%d + %d start at %s" % (a, b, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
time.sleep(1)
print("%d + %d end at %s" % (a, b, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
def without_pool():
start_time = datetime.datetime.now()
for i in range(3):
add(i, i+1)
end_time = datetime.datetime.now()
print("without pool cost %s" % (end_time - start_time))
def with_pool():
start_time = datetime.datetime.now()
pool = threadpool.ThreadPool(2)
requests = threadpool.makeRequests(add, [(0,1),(1,2),(2,3)])
for req in requests:
pool.putRequest(req)
pool.wait()
end_time = datetime.datetime.now()
print("with pool cost %s" % (end_time - start_time))
if __name__ == "__main__":
without_pool()
with_pool()
首先定义了一个add函数,该函数接收两个参数并打印出运行开始和结束的时间,中间使用time.sleep模拟较长的运行时间。
然后定义了without_pool函数和with_pool函数,分别对比了不使用线程池和使用线程池时执行三个任务的时间。
在without_pool函数中,循环调用add函数三次,依次传入参数0和1、1和2、2和3,即在单线程中串行执行三个任务。在with_pool函数中,使用ThreadPool类创建了一个线程池pool,指定线程数为2,并使用makeRequests函数创建了三个任务,然后将任务添加到任务队列中并等待所有任务执行完成。
执行这段代码可以看出,使用线程池可以缩短运行的时间,说明线程池的确可以有效地提高并发执行任务的效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python线程池threadpool实现篇 - Python技术站