python3 线程池
时间: 2023-12-03 10:41:00 浏览: 92
Python3中的线程池可以使用concurrent.futures模块中的ThreadPoolExecutor类来实现。下面是一个简单的例子:
```python
from concurrent.futures import ThreadPoolExecutor
import time
def worker(num):
print('Worker %d started' % num)
time.sleep(2)
print('Worker %d finished' % num)
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=3) as executor:
for i in range(5):
executor.submit(worker, i)
```
上述代码中,我们首先定义了一个worker函数,该函数模拟了一个需要执行2秒的任务。然后我们使用ThreadPoolExecutor类创建了一个最大工作线程数为3的线程池,并使用submit方法向线程池提交了5个任务。由于线程池最大工作线程数为3,因此前3个任务会立即开始执行,而后面的2个任务需要等待前面的任务执行完毕后才能开始执行。
相关问题
python3线程池
Python3中提供了concurrent.futures模块,其中包含了ThreadPoolExecutor线程池类。使用线程池可以避免频繁创建和销毁线程的开销,提高程序的效率。下面是一个简单的线程池使用例子:
```python
import concurrent.futures
import time
def worker(num):
print(f"Thread-{num} start")
time.sleep(1)
print(f"Thread-{num} end")
if __name__ == '__main__':
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
for i in range(3):
executor.submit(worker, i)
```
上述代码中,我们首先定义了一个worker函数,该函数接受一个参数num,表示线程编号。在worker函数中,我们先打印出线程开始执行的信息,然后让线程休眠1秒钟,最后打印出线程结束执行的信息。
在主程序中,我们使用ThreadPoolExecutor创建了一个最大线程数为3的线程池。然后使用submit方法向线程池中提交任务,submit方法接受两个参数,第一个参数是要执行的函数,第二个参数是要传递给函数的参数。在本例中,我们向线程池中提交了3个任务,每个任务都是执行worker函数,并传递了一个不同的参数。
运行上述代码,可以看到输出结果如下:
```
Thread-0 start
Thread-1 start
Thread-2 start
Thread-0 end
Thread-1 end
Thread-2 end
```
可以看到,三个线程分别执行了worker函数,并且是并发执行的。
python3线程池锁
在Python中,可以使用`threading`模块来实现线程池锁。其中,`Lock`和`RLock`是两种常用的锁类型。`Lock`是最基本的锁类型,它提供了互斥锁的机制,即同一时刻只能有一个线程访问共享资源。而`RLock`则是可重入锁,它允许一个线程多次获取同一个锁,避免了死锁的问题。
下面是一个使用线程池锁的例子,其中使用了`ThreadPoolExecutor`来创建线程池,并使用`with`语句来自动获取和释放锁资源:
```python
import concurrent.futures
import threading
total = 0
lock = threading.Lock()
def add():
global total
for i in range(1000000):
with lock:
total += 1
def desc():
global total
for i in range(1000000):
with lock:
total -= 1
if __name__ == '__main__':
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
executor.submit(add)
executor.submit(desc)
print(total)
```
在上面的例子中,我们创建了一个包含两个线程的线程池,并使用`submit`方法将`add`和`desc`函数提交到线程池中执行。在`add`和`desc`函数中,我们使用`with`语句来获取和释放锁资源,确保同一时刻只有一个线程能够访问`total`变量。最后,我们输出`total`的值,可以看到它的值为0,说明线程池锁起到了作用。
阅读全文
相关推荐













