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 如何控制线程数?
7 回复

线程池
<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)

代码说明:

  1. 任务队列:使用queue.Queue作为任务缓冲区,线程从中获取任务。
  2. 线程创建:通过循环创建指定数量的线程(max_threads参数控制)。
  3. 任务分配:线程通过task_queue.get()获取任务,处理完成后调用task_queue.task_done()
  4. 同步机制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()

这个应该是进程池吧?

回到顶部