线程池和队列实现排队
时间: 2023-06-28 12:08:19 浏览: 238
线程池和队列可以一起实现任务排队。当一个任务到来时,首先将其放入队列中排队。线程池中的空闲线程会从队列中取出任务并执行,当队列为空时,线程将等待新的任务到来。
以下是一个简单的示例代码:
```python
import queue
import threading
class ThreadPool:
def __init__(self, maxsize):
self.maxsize = maxsize
self.tasks = queue.Queue()
self.workers = []
def submit(self, func, *args, **kwargs):
self.tasks.put((func, args, kwargs))
self._create_worker()
def _create_worker(self):
if len(self.workers) < self.maxsize:
worker = threading.Thread(target=self._process_tasks)
self.workers.append(worker)
worker.start()
def _process_tasks(self):
while True:
try:
func, args, kwargs = self.tasks.get()
except queue.Empty:
break
else:
func(*args, **kwargs)
def my_task(i):
print(f"Task {i} is running")
if __name__ == "__main__":
pool = ThreadPool(5)
for i in range(10):
pool.submit(my_task, i)
```
在这个示例中,我们定义了一个 `ThreadPool` 类,它包含一个任务队列 `tasks` 和一个线程池 `workers`。通过 `submit` 方法,我们可以将一个任务添加到队列中。当队列中有任务时,线程池中的空闲线程会从队列中取出任务,并调用相应的函数进行处理。
在 `main` 函数中,我们创建了一个 `ThreadPool` 实例,并将 10 个任务提交到线程池中。由于线程池中最多可以同时运行 5 个线程,因此前 5 个任务会立即开始执行,后面的任务则会等待前面的任务完成后再执行。
阅读全文