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的经理,依此类推)
并行实现方案
核心思路
- 为每个用户单独维护层级链,避免全局变量引发的线程安全问题
- 采用线程池处理并行查询(LDAP查询属于IO密集型任务,线程池比进程池更高效)
- 用循环替代递归,避免递归深度过大导致栈溢出
代码实现
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
相关产品推荐
相关产品推荐

