Python threading 如何控制线程数?
if name == "main": file = open("mssql.ip",'r') for ip in file.readlines(): ip = ip.strip('\n') t1 = Thread(target=content,args=(ip,)) t1.start() 写一个东西 目前是这么用的 怎么控制线程数量
Python threading 如何控制线程数?
线程池<br>pip install threadpool <br>
在Python中控制线程数,最直接的方法是使用threading模块配合queue来创建线程池。下面是一个完整的示例:
import threading
import queue
import time
def worker(task_queue, thread_id):
"""工作线程函数"""
while True:
try:
# 从队列获取任务,timeout=1避免无限等待
task = task_queue.get(timeout=1)
print(f"线程 {thread_id} 正在处理任务: {task}")
time.sleep(0.5) # 模拟任务处理
task_queue.task_done() # 标记任务完成
except queue.Empty:
# 队列为空时退出线程
print(f"线程 {thread_id} 退出")
break
def main(max_threads=3, total_tasks=10):
"""主函数:创建线程池并分配任务"""
# 创建任务队列
task_queue = queue.Queue()
# 填充任务
for i in range(total_tasks):
task_queue.put(f"Task-{i}")
# 创建并启动线程
threads = []
for i in range(max_threads):
t = threading.Thread(target=worker, args=(task_queue, i))
t.start()
threads.append(t)
# 等待所有任务完成
task_queue.join()
# 等待所有线程结束
for t in threads:
t.join()
print("所有任务处理完成")
if __name__ == "__main__":
main(max_threads=3, total_tasks=10)
代码说明:
- 任务队列:使用
queue.Queue作为任务缓冲区,线程从中获取任务。 - 线程创建:通过循环创建指定数量的线程(
max_threads参数控制)。 - 任务分配:线程通过
task_queue.get()获取任务,处理完成后调用task_queue.task_done()。 - 同步机制:
task_queue.join()确保所有任务完成后才继续执行,避免主线程提前退出。
关键点:
- 通过
max_threads参数直接控制最大并发线程数。 - 队列自动处理任务分配,空闲线程会等待新任务。
- 使用
task_queue.task_done()和task_queue.join()实现任务完成同步。
替代方案:
对于更复杂的场景,可以考虑使用concurrent.futures.ThreadPoolExecutor:
from concurrent.futures import ThreadPoolExecutor
def task(n):
print(f"处理任务 {n}")
time.sleep(0.5)
return n * 2
with ThreadPoolExecutor(max_workers=3) as executor:
results = list(executor.map(task, range(10)))
总结:用队列管理任务,通过线程数参数控制并发。
python<br>from multiprocessing.dummy import Pool as ThreadPool<br>
concurrent.future.ThreadPoolExecutor
应该有类似 java 的线程池
https://segmentfault.com/a/1190000000414339
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool()
pool = ThreadPool(4) # Sets the pool size to 4
results = pool.map(func, paras)
pool.close()
pool.join()
这个应该是进程池吧?

