写一个线程池,并使用它
时间: 2024-04-29 14:21:34 浏览: 10
好的,我可以给你一个简单的线程池实现,并提供一个使用它的例子。
线程池的实现:
```python
import threading
from queue import Queue
class ThreadPool:
def __init__(self, num_threads):
self.tasks = Queue(num_threads)
for _ in range(num_threads):
Worker(self.tasks)
def add_task(self, func, *args, **kwargs):
self.tasks.put((func, args, kwargs))
class Worker(threading.Thread):
def __init__(self, tasks):
threading.Thread.__init__(self)
self.tasks = tasks
self.daemon = True
self.start()
def run(self):
while True:
func, args, kwargs = self.tasks.get()
try:
func(*args, **kwargs)
except Exception as e:
print(e)
finally:
self.tasks.task_done()
```
这个线程池实现使用 Python 标准库中的线程和队列,其中 `ThreadPool` 类代表整个线程池,`Worker` 类代表线程池中的工作线程。`ThreadPool` 类有一个 `add_task` 方法,可以向线程池中添加任务,`Worker` 类会不断从任务队列中获取任务并执行。
现在我们来看一个使用线程池的例子,假设我们有一个需要计算的函数 `expensive_function`,我们希望用线程池来并行计算它的结果:
```python
import time
def expensive_function(n):
time.sleep(1)
return n * n
def print_result(n, result):
print(f"The result of {n} squared is {result}")
if __name__ == "__main__":
pool = ThreadPool(2) # 创建一个包含两个线程的线程池
for i in range(10):
pool.add_task(expensive_function, i)
pool.tasks.join() # 等待所有任务完成
```
在这个例子中,我们创建了一个包含两个线程的线程池,并且向线程池中添加了 10 个任务。运行这个程序,我们可以看到每个任务都会在大约 1 秒钟之后完成,并且线程池中的两个线程会不断地获取新的任务并执行。
希望这个简单的线程池实现和使用例子对你有所帮助!