如何找出流程中的循环依赖

开发过程中,碰到流程性质的业务时,可将一个个流程抽象成一个个的执行对象
流程之间会有依赖关系,现在就变成了对象之间的依赖关系
对象的依赖关系如果碰到循环依赖的话整个执行就会变成一个死循环
如果流程特别多,出现循环依赖的话,人工排查就会特别费事

如何在代码中排查循环依赖,并确定哪些地方有循环依赖,直接见代码

def get_dependency_lst():
    return [
        ("A", ["B", "C", "D"]),
        ("B", ["B", "C", "A"]),
        ("C", ["D"]),
        ("D", [])
    ]


def check_depends_yield(depends_dict, depends_chain, current_idx):
    """使用递归回溯找到所有有循环依赖的的依赖链
    :param depends_dict: 
    :param depends_chain: 
    :param current_idx: 
    :return: 
	"""
    if current_idx not in depends_dict:
        raise Exception(f"index {current_idx} not in index dict")

    if current_idx[-1] in depends_chain[:-1]:
        yield depends_chain
        print(f"find one cycle depends chain:{depends_chain}")
        return

    current_depends = depends_dict[current_idx]
    for idx in current_depends:
        yield from check_depends_yield(depends_dict, depends_chain + (idx,), idx)


def check_depends_del(depends_dict):
    """
    循环删除0度依赖来判定是否存在循环依赖
    :param depends_dict:
    :return:
    """
    from copy import deepcopy
    depends_dict_cp = deepcopy(depends_dict)

    while True:

        depend_zero_degree = [k for k, v in depends_dict_cp.items() if not v]

        if not depend_zero_degree:
            break

        for k in depend_zero_degree:
            depends_dict_cp.pop(k)

        depends_dict_cp = {k: [i for i in v if i not in depend_zero_degree] for k, v in depends_dict_cp.items()}

    if not depends_dict_cp:
        print("not found cycle depend")
        return

    print(f"found cycle depends: {depends_dict_cp}")


def check_cycle_dependency():
    depends_dict = {item[0]: item[1] for item in get_dependency_lst()}

    for index in depends_dict:
        ret = []
        for chain in check_depends_yield(depends_dict, (index,), index):
            ret.append(chain)
        if ret:
            print(ret)
            print('==================\n')

    check_depends_del(depends_dict)


if __name__ == "__main__":
    check_cycle_dependency()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值