提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在日常生活中,如果需要复用多线程去处理成千上万的任务时,我们不能无限的去新建线程,销毁线程,这样会导致服务器出现灾难性的后果,这时,我们就需要使用线程池,这样我们可以最程度的减少创建线程,销毁线程造成的资源消耗下面我们来看一下python三种线程池的实现一、concurrent.futures 中实现的ThreadPoolExecutor
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
from concurrent.futures import ThreadPoolExecutor
threadPool = ThreadPoolExecutor(max_workers=5, thread_name_prefix="thread")
for i in range(0, 10):
future = threadPool.submit(foo, i,)
print(future.result())
二、 multiprocessing.pool 中实现的ThreadPool
代码如下(示例):
In : from multiprocessing.pool import ThreadPool
In : pool = ThreadPool(5)
In : pool.map(lambda x: x**2, range(5))
Out: [0, 1, 4, 9, 16]
三、自定义一个线程池
代码如下(示例):
import threading
from queue import Queue
'''
线程池, 同时多个任务一起提交,提高并发度
'''
class WorkThread(threading.Thread):
def __init__(self, queue):
super().__init__()
self._queue = queue
self.daemon = True
self.start() # run()
def run(self):
while 1:
fun, args, kwargs = self._queue.get()
try:
fun(*args, **kwargs)
except Exception as e:
raise e
self._queue.task_done()
class ThreadPool(object):
def __init__(self, size):
self.size = size
self.queue = Queue(size)
for _ in range(size):
WorkThread(self.queue)
def add_task(self, f, *args, **kwargs):
self.queue.put((f, args, kwargs))
def join(self):
self.queue.join()
# test
def foo(n):
import time
print('waiting 3s')
time.sleep(3)
print('waiting 5s')
time.sleep(5)
print(n ** 2)
pool = ThreadPool(5)
for i in range(10):
pool.add_task(foo, i)
pool.join()
结果:
总结
利用好线程池,能使你程序事半功倍。版权声明:本文为u014770372原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。