用python语言封装一个多线程类可以控制线程数
时间: 2023-08-04 13:22:51 浏览: 41
好的,以下是一个简单的Python多线程类,可以控制线程数:
```python
import threading
import queue
class ThreadPool:
def __init__(self, max_workers):
self.max_workers = max_workers
self.workers = []
self.tasks = queue.Queue()
def start(self):
for i in range(self.max_workers):
worker = threading.Thread(target=self.worker)
worker.start()
self.workers.append(worker)
def submit(self, func, *args, **kwargs):
self.tasks.put((func, args, kwargs))
def worker(self):
while True:
func, args, kwargs = self.tasks.get()
try:
func(*args, **kwargs)
except Exception as e:
print('Error:', e)
finally:
self.tasks.task_done()
def join(self):
self.tasks.join()
```
在这个类中,我们使用了Python内置的`threading`模块和`queue`模块,实现了一个线程池。在`__init__`方法中,我们初始化了线程池的最大工作线程数、工作线程列表和任务队列。`start`方法启动了所有工作线程,并将它们存储在`workers`列表中。`submit`方法用于向任务队列中提交任务。`worker`方法是每个工作线程的执行函数,它会从任务队列中获取任务,并调用相应的函数执行任务。在执行任务时,我们通过`try...except`块捕获异常,避免线程因异常而终止。最后,在`join`方法中阻塞主线程,直到所有任务都被处理完毕。
使用该线程池时,可以先实例化一个`ThreadPool`对象,并指定最大工作线程数,然后调用`start`方法启动工作线程。随后,可以通过`submit`方法向任务队列中提交任务,任务可以是任何可调用对象,例如函数或方法。最后,调用`join`方法等待所有任务完成即可。
例如,以下是一个例子:
```python
def task(num):
print('Task', num, 'started')
time.sleep(1)
print('Task', num, 'finished')
pool = ThreadPool(max_workers=2)
pool.start()
for i in range(10):
pool.submit(task, i+1)
pool.join()
```
在这个例子中,我们定义了一个`task`函数,其功能是打印出任务编号,然后等待一秒钟,最后再打印出任务编号。接着,我们实例化了一个线程池,最大工作线程数为2,并启动了工作线程。然后,我们向任务队列中提交了10个任务,每个任务执行的是`task`函数。最后,我们调用`join`方法等待所有任务完成。
由于线程池中最大工作线程数为2,因此在任意时刻,最多只有2个任务在同时执行。这样可以控制线程数,避免线程数量过多导致系统性能下降。