![](/img/trans.png)
[英]Error to create a flow in prefect for python using with and object Flow()
[英]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.