You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现多用户递归并行查询LDAP管理层级需求

需求概述

现有用户列表user_list = ["user1","user2","user3","user4","user5"],需实现查询函数,通过LDAP获取每个用户的完整管理层级链(从直属经理递归追溯至无上级的CEO)。原递归函数仅支持单用户串行查询,需改写为支持多用户并行执行的版本。

原函数代码

user_list =["user1","user2","user3","user4","user5"]

def search(user):
    user_details = ldap.search(user)
    user_manager = user_details["manager"]
    new_user = user_manager
    list_of_user_managers.append(new_user)
    if new_user["manager"] == "None":
       return list_of_user_managers
    else:
       return search(new_user)

数据格式说明

LDAP查询返回的user_details示例格式:

user_details = {
    'ntid': 'tom', 
    'ldap_owner': 'roy', 
    'ldap_manager': 'noman', 
    'ldap_email': 'austin@xyz.com'
}

注意:原代码中使用user_details["manager"],但示例数据中对应键为ldap_manager,实际开发时需保证键名与LDAP返回一致

预期结果示例

  • user1 管理层级链:manager1, manager2, manager3, manager4(manager1为user1直属经理,manager2为manager1的经理,依此类推)
  • user2 管理层级链:manager11, manager22, manager33, manager44(manager11为user2直属经理,manager22为manager11的经理,依此类推)
并行实现方案

核心思路

  1. 为每个用户单独维护层级链,避免全局变量引发的线程安全问题
  2. 采用线程池处理并行查询(LDAP查询属于IO密集型任务,线程池比进程池更高效)
  3. 用循环替代递归,避免递归深度过大导致栈溢出

代码实现

import concurrent.futures
import ldap  # 需提前安装并配置LDAP客户端

user_list = ["user1", "user2", "user3", "user4", "user5"]

def get_single_user_hierarchy(user):
    """获取单个用户的完整管理层级链"""
    hierarchy = []
    current_user = user
    while True:
        # 查询当前用户的LDAP详情
        user_details = ldap.search(current_user)
        # 根据实际LDAP返回的键名调整,这里用示例中的ldap_manager
        manager = user_details.get("ldap_manager")
        # 终止条件:无上级经理
        if manager == "None" or not manager:
            break
        hierarchy.append(manager)
        current_user = manager
    return user, hierarchy

def batch_search_hierarchies(user_list):
    """批量并行查询多用户的管理层级链"""
    result = {}
    # 线程池大小可根据实际场景调整
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        # 提交所有查询任务
        futures = {executor.submit(get_single_user_hierarchy, user): user for user in user_list}
        # 逐个获取任务结果
        for future in concurrent.futures.as_completed(futures):
            user, hierarchy = future.result()
            result[user] = hierarchy
    return result

# 调用示例
if __name__ == "__main__":
    hierarchies = batch_search_hierarchies(user_list)
    for user, chain in hierarchies.items():
        print(f"{user} 管理层级链: {', '.join(chain)}")

关键说明

  • 每个用户的层级查询独立执行,无全局变量共享,确保线程安全
  • 循环替代递归,避免因管理层级过深触发递归栈溢出
  • 可根据实际需求添加异常处理逻辑(如LDAP连接失败、查询超时等)

内容的提问来源于stack exchange,提问作者witty_minds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:30:11