在 Python 中,使用 `concurrent.futures.ThreadPoolExecutor` 创建线程池是一种常见的做法。要创建一个单例线程池,我们可以利用线程池的初始化参数 `max_workers` 来限制线程数量,同时使用一个锁来同步线程间的操作。下面是一个简单的示例代码,展示如何创建一个带有锁的单例线程池,并使用它来执行任务。
import threading
from concurrent.futures import ThreadPoolExecutor
# 单例线程池的实现
class SingletonThreadPool:
_instance = None
_lock = threading.Lock()
def __new__(cls):
with cls._lock:
if cls._instance is None:
cls._instance = super(SingletonThreadPool, cls).__new__(cls)
cls._pool = ThreadPoolExecutor(max_workers=1) # 创建单例线程池
return cls._instance
def submit(self, func, *args, **kwargs):
return self._pool.submit(func, *args, **kwargs)
def shutdown(self, wait=True):
self._pool.shutdown(wait=wait)
# 使用示例
def task_function(x):
print(f"Processing {x}")
# 创建单例线程池实例
singleton_pool = SingletonThreadPool()
# 向线程池提交任务
future = singleton_pool.submit(task_function, "Task 1")
# 等待任务完成并获取结果
result = future.result()
print(f"Task completed with result: {result}")
# 关闭线程池
singleton_pool.shutdown()
在这个示例中,`SingletonThreadPool` 类使用了一个私有类属性 `_instance` 来存储单例对象,并使用一个锁 `_lock` 来确保线程安全。`__new__` 方法确保了线程池的单例性,`submit` 方法用于向线程池提交任务,`shutdown` 方法用于关闭线程池。
请注意,这个示例中的线程池使用了 `max_workers=1` 参数,这意味着它将始终只有一个工作线程,从而实现了单例线程池的效果。此外,示例中的任务函数 `task_function` 只是一个简单的打印函数,用于演示如何使用线程池执行任务。在实际应用中,你可以替换为任何需要并发执行的函数。