簡體   English   中英

為什么完美流程會因深度遞歸錯誤而崩潰?

[英]Why prefect flow crashes with deep recursion error?

代碼

vault_client = hvac.Client()
new_password = secrets.token_urlsafe(16)
accounts_list = ['account_1', 'account_2'] # dicts


###
# Prefect Tasks
###

@task()
def read_old_secret(account: dict):
    old_secret = vault_client.secrets.kv.v2.read_secret(path=account['secret_path'])
    return old_secret['password']


@task()
def rotate_password(account: dict, old_password: str, new_password: str):



@task()
def store_new_password_to_vault(account: dict, new_password: str):
    vault_client.secrets.kv.v2.create_or_update_secret(
        mount_point='point',
        path=account['secret_path'],
        secret={"password": new_password}
    )


###
# Prefect Flow definition and task orchestration
###

with Flow(
        name="flow",
        storage=Local(),
        executor=LocalDaskExecutor(scheduler=config.get('core', 'scheduler'),
                                   num_workers=config.getint('core', 'num_workers')),
        result=LocalResult(dir=config.get('core', 'local_result_dir'))
) as flow:
    for account in accounts_list:
        old_password = read_old_secret(account=account)
        rotate_password(account=account, old_password=old_password, new_password=new_password)
        store_new_password_to_vault(account=account, new_password=new_password)

# Run flow locally (for tests)
if __name__ == '__main__':
    flow.run()

在嘗試運行流程時,它會因錯誤而崩潰

[2022] INFO - prefect.FlowRunner | Beginning Flow run for 'flow'
[2022] ERROR - prefect.FlowRunner | Unexpected error: PicklingError('Could not pickle object as excessively deep recursion required.')
Traceback (most recent call last):
  File "/data/prefect/venv/lib/python3.9/site-packages/cloudpickle/cloudpickle_fast.py", line 633, in dump
    return Pickler.dump(self, obj)
  File "/data/prefect/venv/lib/python3.9/site-packages/cloudpickle/cloudpickle_fast.py", line 709, in reducer_override
    if sys.version_info[:2] < (3, 7) and _is_parametrized_type_hint(obj):  # noqa  # pragma: no branch
RecursionError: maximum recursion depth exceeded in comparison

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/data/prefect/venv/lib/python3.9/site-packages/prefect/engine/runner.py", line 48, in inner
    new_state = method(self, state, *args, **kwargs)
  File "/data/prefect/venv/lib/python3.9/site-packages/prefect/engine/flow_runner.py", line 643, in get_flow_run_state
    final_states = executor.wait(
  File "/data/prefect/venv/lib/python3.9/site-packages/prefect/executors/dask.py", line 685, in wait
    return dask.compute(
  File "/data/prefect/venv/lib/python3.9/site-packages/dask/base.py", line 603, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/data/prefect/venv/lib/python3.9/site-packages/dask/multiprocessing.py", line 233, in get
    result = get_async(
  File "/data/prefect/venv/lib/python3.9/site-packages/dask/local.py", line 511, in get_async
    raise_exception(exc, tb)
  File "/data/prefect/venv/lib/python3.9/site-packages/dask/local.py", line 319, in reraise
    raise exc
  File "/data/prefect/venv/lib/python3.9/site-packages/dask/multiprocessing.py", line 118, in pack_exception
    result = dumps((e, tb))
  File "/data/prefect/venv/lib/python3.9/site-packages/cloudpickle/cloudpickle_fast.py", line 73, in dumps
    cp.dump(obj)
  File "/data/prefect/venv/lib/python3.9/site-packages/cloudpickle/cloudpickle_fast.py", line 640, in dump
    raise pickle.PicklingError(msg) from e
_pickle.PicklingError: Could not pickle object as excessively deep recursion required.
[2022] ERROR - prefect.flow | Unexpected error occured in FlowRunner: PicklingError('Could not pickle object as excessively deep recursion required.')

已經嘗試過 sys.setrecursionlimit(3000),沒有幫助根本沒有在搜索中找到如何調試深度遞歸..,請。 幫助。

您正在使用 LocalDaskExecutor 進程,當它們被交給進程時,它將腌制函數所需的任何東西。

很難說,但如果我不得不猜測, hvac.Client()是不可序列化的。 您可以通過以下方式進行測試:

import cloudpickle
cloudpickle.dumps(hvac.Client())

我懷疑錯誤會重現。 您可以通過在任務中創建客戶端來避免這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM