python线程池加锁with lock
时间: 2023-10-24 13:23:21 浏览: 107
线程池.zip,互斥锁+条件变量+队列,实现线程池,包括线程池的创建,塞任务,和销毁线程池
线程池可以通过使用锁来确保线程安全。通常可以使用Python中的`threading.Lock`类来实现锁。下面是一个使用锁的线程池示例:
```python
import threading
class ThreadPool:
def __init__(self, num_threads):
self.num_threads = num_threads
self.lock = threading.Lock()
self.tasks = []
self.results = []
def add_task(self, func, *args, **kwargs):
self.lock.acquire()
self.tasks.append((func, args, kwargs))
self.lock.release()
def get_result(self):
if len(self.results) > 0:
return self.results.pop(0)
else:
return None
def worker(self):
while True:
self.lock.acquire()
if len(self.tasks) == 0:
self.lock.release()
break
else:
func, args, kwargs = self.tasks.pop(0)
self.lock.release()
result = func(*args, **kwargs)
self.results.append(result)
def start(self):
threads = []
for i in range(self.num_threads):
t = threading.Thread(target=self.worker)
t.start()
threads.append(t)
for t in threads:
t.join()
```
在上述示例中,我们使用了`threading.Lock`类来确保共享变量`tasks`和`results`的安全访问。具体来说,当我们向线程池中添加任务时,我们首先获取锁,以确保不会出现多个线程同时修改`tasks`,然后在添加任务后释放锁。在工作线程中,我们也首先获取锁来获取任务,以确保不会有多个线程同时获取同一个任务。当一个任务完成时,我们将结果添加到`results`中,同样需要获取锁以确保安全访问。最后,在启动线程池时,我们创建了多个工作线程,并使用`join()`等待它们完成。
阅读全文