prefect-client 2.20.2__py3-none-any.whl → 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/__init__.py +74 -110
- prefect/_internal/compatibility/deprecated.py +6 -115
- prefect/_internal/compatibility/experimental.py +4 -79
- prefect/_internal/compatibility/migration.py +166 -0
- prefect/_internal/concurrency/__init__.py +2 -2
- prefect/_internal/concurrency/api.py +1 -35
- prefect/_internal/concurrency/calls.py +0 -6
- prefect/_internal/concurrency/cancellation.py +0 -3
- prefect/_internal/concurrency/event_loop.py +0 -20
- prefect/_internal/concurrency/inspection.py +3 -3
- prefect/_internal/concurrency/primitives.py +1 -0
- prefect/_internal/concurrency/services.py +23 -0
- prefect/_internal/concurrency/threads.py +35 -0
- prefect/_internal/concurrency/waiters.py +0 -28
- prefect/_internal/integrations.py +7 -0
- prefect/_internal/pydantic/__init__.py +0 -45
- prefect/_internal/pydantic/annotations/pendulum.py +2 -2
- prefect/_internal/pydantic/v1_schema.py +21 -22
- prefect/_internal/pydantic/v2_schema.py +0 -2
- prefect/_internal/pydantic/v2_validated_func.py +18 -23
- prefect/_internal/pytz.py +1 -1
- prefect/_internal/retries.py +61 -0
- prefect/_internal/schemas/bases.py +45 -177
- prefect/_internal/schemas/fields.py +1 -43
- prefect/_internal/schemas/validators.py +47 -233
- prefect/agent.py +3 -695
- prefect/artifacts.py +173 -14
- prefect/automations.py +39 -4
- prefect/blocks/abstract.py +1 -1
- prefect/blocks/core.py +423 -164
- prefect/blocks/fields.py +2 -57
- prefect/blocks/notifications.py +43 -28
- prefect/blocks/redis.py +168 -0
- prefect/blocks/system.py +67 -20
- prefect/blocks/webhook.py +2 -9
- prefect/cache_policies.py +239 -0
- prefect/client/__init__.py +4 -0
- prefect/client/base.py +33 -27
- prefect/client/cloud.py +65 -20
- prefect/client/collections.py +1 -1
- prefect/client/orchestration.py +667 -440
- prefect/client/schemas/actions.py +115 -100
- prefect/client/schemas/filters.py +46 -52
- prefect/client/schemas/objects.py +228 -178
- prefect/client/schemas/responses.py +18 -36
- prefect/client/schemas/schedules.py +55 -36
- prefect/client/schemas/sorting.py +2 -0
- prefect/client/subscriptions.py +8 -7
- prefect/client/types/flexible_schedule_list.py +11 -0
- prefect/client/utilities.py +9 -6
- prefect/concurrency/asyncio.py +60 -11
- prefect/concurrency/context.py +24 -0
- prefect/concurrency/events.py +2 -2
- prefect/concurrency/services.py +46 -16
- prefect/concurrency/sync.py +51 -7
- prefect/concurrency/v1/asyncio.py +143 -0
- prefect/concurrency/v1/context.py +27 -0
- prefect/concurrency/v1/events.py +61 -0
- prefect/concurrency/v1/services.py +116 -0
- prefect/concurrency/v1/sync.py +92 -0
- prefect/context.py +246 -149
- prefect/deployments/__init__.py +33 -18
- prefect/deployments/base.py +10 -15
- prefect/deployments/deployments.py +2 -1048
- prefect/deployments/flow_runs.py +178 -0
- prefect/deployments/runner.py +72 -173
- prefect/deployments/schedules.py +31 -25
- prefect/deployments/steps/__init__.py +0 -1
- prefect/deployments/steps/core.py +7 -0
- prefect/deployments/steps/pull.py +15 -21
- prefect/deployments/steps/utility.py +2 -1
- prefect/docker/__init__.py +20 -0
- prefect/docker/docker_image.py +82 -0
- prefect/engine.py +15 -2466
- prefect/events/actions.py +17 -23
- prefect/events/cli/automations.py +20 -7
- prefect/events/clients.py +142 -80
- prefect/events/filters.py +14 -18
- prefect/events/related.py +74 -75
- prefect/events/schemas/__init__.py +0 -5
- prefect/events/schemas/automations.py +55 -46
- prefect/events/schemas/deployment_triggers.py +7 -197
- prefect/events/schemas/events.py +46 -65
- prefect/events/schemas/labelling.py +10 -14
- prefect/events/utilities.py +4 -5
- prefect/events/worker.py +23 -8
- prefect/exceptions.py +15 -0
- prefect/filesystems.py +30 -529
- prefect/flow_engine.py +827 -0
- prefect/flow_runs.py +379 -7
- prefect/flows.py +470 -360
- prefect/futures.py +382 -331
- prefect/infrastructure/__init__.py +5 -26
- prefect/infrastructure/base.py +3 -320
- prefect/infrastructure/provisioners/__init__.py +5 -3
- prefect/infrastructure/provisioners/cloud_run.py +13 -8
- prefect/infrastructure/provisioners/container_instance.py +14 -9
- prefect/infrastructure/provisioners/ecs.py +10 -8
- prefect/infrastructure/provisioners/modal.py +8 -5
- prefect/input/__init__.py +4 -0
- prefect/input/actions.py +2 -4
- prefect/input/run_input.py +9 -9
- prefect/logging/formatters.py +2 -4
- prefect/logging/handlers.py +9 -14
- prefect/logging/loggers.py +5 -5
- prefect/main.py +72 -0
- prefect/plugins.py +2 -64
- prefect/profiles.toml +16 -2
- prefect/records/__init__.py +1 -0
- prefect/records/base.py +223 -0
- prefect/records/filesystem.py +207 -0
- prefect/records/memory.py +178 -0
- prefect/records/result_store.py +64 -0
- prefect/results.py +577 -504
- prefect/runner/runner.py +124 -51
- prefect/runner/server.py +32 -34
- prefect/runner/storage.py +3 -12
- prefect/runner/submit.py +2 -10
- prefect/runner/utils.py +2 -2
- prefect/runtime/__init__.py +1 -0
- prefect/runtime/deployment.py +1 -0
- prefect/runtime/flow_run.py +40 -5
- prefect/runtime/task_run.py +1 -0
- prefect/serializers.py +28 -39
- prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
- prefect/settings.py +209 -332
- prefect/states.py +160 -63
- prefect/task_engine.py +1478 -57
- prefect/task_runners.py +383 -287
- prefect/task_runs.py +240 -0
- prefect/task_worker.py +463 -0
- prefect/tasks.py +684 -374
- prefect/transactions.py +410 -0
- prefect/types/__init__.py +72 -86
- prefect/types/entrypoint.py +13 -0
- prefect/utilities/annotations.py +4 -3
- prefect/utilities/asyncutils.py +227 -148
- prefect/utilities/callables.py +138 -48
- prefect/utilities/collections.py +134 -86
- prefect/utilities/dispatch.py +27 -14
- prefect/utilities/dockerutils.py +11 -4
- prefect/utilities/engine.py +186 -32
- prefect/utilities/filesystem.py +4 -5
- prefect/utilities/importtools.py +26 -27
- prefect/utilities/pydantic.py +128 -38
- prefect/utilities/schema_tools/hydration.py +18 -1
- prefect/utilities/schema_tools/validation.py +30 -0
- prefect/utilities/services.py +35 -9
- prefect/utilities/templating.py +12 -2
- prefect/utilities/timeout.py +20 -5
- prefect/utilities/urls.py +195 -0
- prefect/utilities/visualization.py +1 -0
- prefect/variables.py +78 -59
- prefect/workers/__init__.py +0 -1
- prefect/workers/base.py +237 -244
- prefect/workers/block.py +5 -226
- prefect/workers/cloud.py +6 -0
- prefect/workers/process.py +265 -12
- prefect/workers/server.py +29 -11
- {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/METADATA +30 -26
- prefect_client-3.0.0.dist-info/RECORD +201 -0
- {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
- prefect/_internal/pydantic/_base_model.py +0 -51
- prefect/_internal/pydantic/_compat.py +0 -82
- prefect/_internal/pydantic/_flags.py +0 -20
- prefect/_internal/pydantic/_types.py +0 -8
- prefect/_internal/pydantic/utilities/config_dict.py +0 -72
- prefect/_internal/pydantic/utilities/field_validator.py +0 -150
- prefect/_internal/pydantic/utilities/model_construct.py +0 -56
- prefect/_internal/pydantic/utilities/model_copy.py +0 -55
- prefect/_internal/pydantic/utilities/model_dump.py +0 -136
- prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
- prefect/_internal/pydantic/utilities/model_fields.py +0 -50
- prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
- prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
- prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
- prefect/_internal/pydantic/utilities/model_validate.py +0 -75
- prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
- prefect/_internal/pydantic/utilities/model_validator.py +0 -87
- prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
- prefect/_vendor/fastapi/__init__.py +0 -25
- prefect/_vendor/fastapi/applications.py +0 -946
- prefect/_vendor/fastapi/background.py +0 -3
- prefect/_vendor/fastapi/concurrency.py +0 -44
- prefect/_vendor/fastapi/datastructures.py +0 -58
- prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
- prefect/_vendor/fastapi/dependencies/models.py +0 -64
- prefect/_vendor/fastapi/dependencies/utils.py +0 -877
- prefect/_vendor/fastapi/encoders.py +0 -177
- prefect/_vendor/fastapi/exception_handlers.py +0 -40
- prefect/_vendor/fastapi/exceptions.py +0 -46
- prefect/_vendor/fastapi/logger.py +0 -3
- prefect/_vendor/fastapi/middleware/__init__.py +0 -1
- prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
- prefect/_vendor/fastapi/middleware/cors.py +0 -3
- prefect/_vendor/fastapi/middleware/gzip.py +0 -3
- prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
- prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
- prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
- prefect/_vendor/fastapi/openapi/__init__.py +0 -0
- prefect/_vendor/fastapi/openapi/constants.py +0 -2
- prefect/_vendor/fastapi/openapi/docs.py +0 -203
- prefect/_vendor/fastapi/openapi/models.py +0 -480
- prefect/_vendor/fastapi/openapi/utils.py +0 -485
- prefect/_vendor/fastapi/param_functions.py +0 -340
- prefect/_vendor/fastapi/params.py +0 -453
- prefect/_vendor/fastapi/py.typed +0 -0
- prefect/_vendor/fastapi/requests.py +0 -4
- prefect/_vendor/fastapi/responses.py +0 -40
- prefect/_vendor/fastapi/routing.py +0 -1331
- prefect/_vendor/fastapi/security/__init__.py +0 -15
- prefect/_vendor/fastapi/security/api_key.py +0 -98
- prefect/_vendor/fastapi/security/base.py +0 -6
- prefect/_vendor/fastapi/security/http.py +0 -172
- prefect/_vendor/fastapi/security/oauth2.py +0 -227
- prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
- prefect/_vendor/fastapi/security/utils.py +0 -10
- prefect/_vendor/fastapi/staticfiles.py +0 -1
- prefect/_vendor/fastapi/templating.py +0 -3
- prefect/_vendor/fastapi/testclient.py +0 -1
- prefect/_vendor/fastapi/types.py +0 -3
- prefect/_vendor/fastapi/utils.py +0 -235
- prefect/_vendor/fastapi/websockets.py +0 -7
- prefect/_vendor/starlette/__init__.py +0 -1
- prefect/_vendor/starlette/_compat.py +0 -28
- prefect/_vendor/starlette/_exception_handler.py +0 -80
- prefect/_vendor/starlette/_utils.py +0 -88
- prefect/_vendor/starlette/applications.py +0 -261
- prefect/_vendor/starlette/authentication.py +0 -159
- prefect/_vendor/starlette/background.py +0 -43
- prefect/_vendor/starlette/concurrency.py +0 -59
- prefect/_vendor/starlette/config.py +0 -151
- prefect/_vendor/starlette/convertors.py +0 -87
- prefect/_vendor/starlette/datastructures.py +0 -707
- prefect/_vendor/starlette/endpoints.py +0 -130
- prefect/_vendor/starlette/exceptions.py +0 -60
- prefect/_vendor/starlette/formparsers.py +0 -276
- prefect/_vendor/starlette/middleware/__init__.py +0 -17
- prefect/_vendor/starlette/middleware/authentication.py +0 -52
- prefect/_vendor/starlette/middleware/base.py +0 -220
- prefect/_vendor/starlette/middleware/cors.py +0 -176
- prefect/_vendor/starlette/middleware/errors.py +0 -265
- prefect/_vendor/starlette/middleware/exceptions.py +0 -74
- prefect/_vendor/starlette/middleware/gzip.py +0 -113
- prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
- prefect/_vendor/starlette/middleware/sessions.py +0 -82
- prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
- prefect/_vendor/starlette/middleware/wsgi.py +0 -147
- prefect/_vendor/starlette/py.typed +0 -0
- prefect/_vendor/starlette/requests.py +0 -328
- prefect/_vendor/starlette/responses.py +0 -347
- prefect/_vendor/starlette/routing.py +0 -933
- prefect/_vendor/starlette/schemas.py +0 -154
- prefect/_vendor/starlette/staticfiles.py +0 -248
- prefect/_vendor/starlette/status.py +0 -199
- prefect/_vendor/starlette/templating.py +0 -231
- prefect/_vendor/starlette/testclient.py +0 -804
- prefect/_vendor/starlette/types.py +0 -30
- prefect/_vendor/starlette/websockets.py +0 -193
- prefect/blocks/kubernetes.py +0 -119
- prefect/deprecated/__init__.py +0 -0
- prefect/deprecated/data_documents.py +0 -350
- prefect/deprecated/packaging/__init__.py +0 -12
- prefect/deprecated/packaging/base.py +0 -96
- prefect/deprecated/packaging/docker.py +0 -146
- prefect/deprecated/packaging/file.py +0 -92
- prefect/deprecated/packaging/orion.py +0 -80
- prefect/deprecated/packaging/serializers.py +0 -171
- prefect/events/instrument.py +0 -135
- prefect/infrastructure/container.py +0 -824
- prefect/infrastructure/kubernetes.py +0 -920
- prefect/infrastructure/process.py +0 -289
- prefect/manifests.py +0 -20
- prefect/new_flow_engine.py +0 -449
- prefect/new_task_engine.py +0 -423
- prefect/pydantic/__init__.py +0 -76
- prefect/pydantic/main.py +0 -39
- prefect/software/__init__.py +0 -2
- prefect/software/base.py +0 -50
- prefect/software/conda.py +0 -199
- prefect/software/pip.py +0 -122
- prefect/software/python.py +0 -52
- prefect/task_server.py +0 -322
- prefect_client-2.20.2.dist-info/RECORD +0 -294
- /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
- /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
- {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
- {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,178 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
from typing import TYPE_CHECKING, Iterable, Optional, Union
|
3
|
+
from uuid import UUID
|
4
|
+
|
5
|
+
import anyio
|
6
|
+
import pendulum
|
7
|
+
|
8
|
+
from prefect.client.schemas import FlowRun
|
9
|
+
from prefect.client.utilities import inject_client
|
10
|
+
from prefect.context import FlowRunContext, TaskRunContext
|
11
|
+
from prefect.logging import get_logger
|
12
|
+
from prefect.states import Pending, Scheduled
|
13
|
+
from prefect.tasks import Task
|
14
|
+
from prefect.utilities.asyncutils import sync_compatible
|
15
|
+
from prefect.utilities.slugify import slugify
|
16
|
+
|
17
|
+
if TYPE_CHECKING:
|
18
|
+
from prefect.client.orchestration import PrefectClient
|
19
|
+
from prefect.client.schemas.objects import FlowRun
|
20
|
+
|
21
|
+
|
22
|
+
logger = get_logger(__name__)
|
23
|
+
|
24
|
+
|
25
|
+
@sync_compatible
|
26
|
+
@inject_client
|
27
|
+
async def run_deployment(
|
28
|
+
name: Union[str, UUID],
|
29
|
+
client: Optional["PrefectClient"] = None,
|
30
|
+
parameters: Optional[dict] = None,
|
31
|
+
scheduled_time: Optional[datetime] = None,
|
32
|
+
flow_run_name: Optional[str] = None,
|
33
|
+
timeout: Optional[float] = None,
|
34
|
+
poll_interval: Optional[float] = 5,
|
35
|
+
tags: Optional[Iterable[str]] = None,
|
36
|
+
idempotency_key: Optional[str] = None,
|
37
|
+
work_queue_name: Optional[str] = None,
|
38
|
+
as_subflow: Optional[bool] = True,
|
39
|
+
job_variables: Optional[dict] = None,
|
40
|
+
) -> "FlowRun":
|
41
|
+
"""
|
42
|
+
Create a flow run for a deployment and return it after completion or a timeout.
|
43
|
+
|
44
|
+
By default, this function blocks until the flow run finishes executing.
|
45
|
+
Specify a timeout (in seconds) to wait for the flow run to execute before
|
46
|
+
returning flow run metadata. To return immediately, without waiting for the
|
47
|
+
flow run to execute, set `timeout=0`.
|
48
|
+
|
49
|
+
Note that if you specify a timeout, this function will return the flow run
|
50
|
+
metadata whether or not the flow run finished executing.
|
51
|
+
|
52
|
+
If called within a flow or task, the flow run this function creates will
|
53
|
+
be linked to the current flow run as a subflow. Disable this behavior by
|
54
|
+
passing `as_subflow=False`.
|
55
|
+
|
56
|
+
Args:
|
57
|
+
name: The deployment id or deployment name in the form:
|
58
|
+
`"flow name/deployment name"`
|
59
|
+
parameters: Parameter overrides for this flow run. Merged with the deployment
|
60
|
+
defaults.
|
61
|
+
scheduled_time: The time to schedule the flow run for, defaults to scheduling
|
62
|
+
the flow run to start now.
|
63
|
+
flow_run_name: A name for the created flow run
|
64
|
+
timeout: The amount of time to wait (in seconds) for the flow run to
|
65
|
+
complete before returning. Setting `timeout` to 0 will return the flow
|
66
|
+
run metadata immediately. Setting `timeout` to None will allow this
|
67
|
+
function to poll indefinitely. Defaults to None.
|
68
|
+
poll_interval: The number of seconds between polls
|
69
|
+
tags: A list of tags to associate with this flow run; tags can be used in
|
70
|
+
automations and for organizational purposes.
|
71
|
+
idempotency_key: A unique value to recognize retries of the same run, and
|
72
|
+
prevent creating multiple flow runs.
|
73
|
+
work_queue_name: The name of a work queue to use for this run. Defaults to
|
74
|
+
the default work queue for the deployment.
|
75
|
+
as_subflow: Whether to link the flow run as a subflow of the current
|
76
|
+
flow or task run.
|
77
|
+
job_variables: A dictionary of dot delimited infrastructure overrides that
|
78
|
+
will be applied at runtime; for example `env.CONFIG_KEY=config_value` or
|
79
|
+
`namespace='prefect'`
|
80
|
+
"""
|
81
|
+
if timeout is not None and timeout < 0:
|
82
|
+
raise ValueError("`timeout` cannot be negative")
|
83
|
+
|
84
|
+
if scheduled_time is None:
|
85
|
+
scheduled_time = pendulum.now("UTC")
|
86
|
+
|
87
|
+
parameters = parameters or {}
|
88
|
+
|
89
|
+
deployment_id = None
|
90
|
+
|
91
|
+
if isinstance(name, UUID):
|
92
|
+
deployment_id = name
|
93
|
+
else:
|
94
|
+
try:
|
95
|
+
deployment_id = UUID(name)
|
96
|
+
except ValueError:
|
97
|
+
pass
|
98
|
+
|
99
|
+
if deployment_id:
|
100
|
+
deployment = await client.read_deployment(deployment_id=deployment_id)
|
101
|
+
else:
|
102
|
+
deployment = await client.read_deployment_by_name(name)
|
103
|
+
|
104
|
+
flow_run_ctx = FlowRunContext.get()
|
105
|
+
task_run_ctx = TaskRunContext.get()
|
106
|
+
if as_subflow and (flow_run_ctx or task_run_ctx):
|
107
|
+
# TODO: this logic can likely be simplified by using `Task.create_run`
|
108
|
+
from prefect.utilities.engine import (
|
109
|
+
_dynamic_key_for_task_run,
|
110
|
+
collect_task_run_inputs,
|
111
|
+
)
|
112
|
+
|
113
|
+
# This was called from a flow. Link the flow run as a subflow.
|
114
|
+
task_inputs = {
|
115
|
+
k: await collect_task_run_inputs(v) for k, v in parameters.items()
|
116
|
+
}
|
117
|
+
|
118
|
+
if deployment_id:
|
119
|
+
flow = await client.read_flow(deployment.flow_id)
|
120
|
+
deployment_name = f"{flow.name}/{deployment.name}"
|
121
|
+
else:
|
122
|
+
deployment_name = name
|
123
|
+
|
124
|
+
# Generate a task in the parent flow run to represent the result of the subflow
|
125
|
+
dummy_task = Task(
|
126
|
+
name=deployment_name,
|
127
|
+
fn=lambda: None,
|
128
|
+
version=deployment.version,
|
129
|
+
)
|
130
|
+
# Override the default task key to include the deployment name
|
131
|
+
dummy_task.task_key = f"{__name__}.run_deployment.{slugify(deployment_name)}"
|
132
|
+
flow_run_id = (
|
133
|
+
flow_run_ctx.flow_run.id
|
134
|
+
if flow_run_ctx
|
135
|
+
else task_run_ctx.task_run.flow_run_id
|
136
|
+
)
|
137
|
+
dynamic_key = (
|
138
|
+
_dynamic_key_for_task_run(flow_run_ctx, dummy_task)
|
139
|
+
if flow_run_ctx
|
140
|
+
else task_run_ctx.task_run.dynamic_key
|
141
|
+
)
|
142
|
+
parent_task_run = await client.create_task_run(
|
143
|
+
task=dummy_task,
|
144
|
+
flow_run_id=flow_run_id,
|
145
|
+
dynamic_key=dynamic_key,
|
146
|
+
task_inputs=task_inputs,
|
147
|
+
state=Pending(),
|
148
|
+
)
|
149
|
+
parent_task_run_id = parent_task_run.id
|
150
|
+
else:
|
151
|
+
parent_task_run_id = None
|
152
|
+
|
153
|
+
flow_run = await client.create_flow_run_from_deployment(
|
154
|
+
deployment.id,
|
155
|
+
parameters=parameters,
|
156
|
+
state=Scheduled(scheduled_time=scheduled_time),
|
157
|
+
name=flow_run_name,
|
158
|
+
tags=tags,
|
159
|
+
idempotency_key=idempotency_key,
|
160
|
+
parent_task_run_id=parent_task_run_id,
|
161
|
+
work_queue_name=work_queue_name,
|
162
|
+
job_variables=job_variables,
|
163
|
+
)
|
164
|
+
|
165
|
+
flow_run_id = flow_run.id
|
166
|
+
|
167
|
+
if timeout == 0:
|
168
|
+
return flow_run
|
169
|
+
|
170
|
+
with anyio.move_on_after(timeout):
|
171
|
+
while True:
|
172
|
+
flow_run = await client.read_flow_run(flow_run_id)
|
173
|
+
flow_state = flow_run.state
|
174
|
+
if flow_state and flow_state.is_final():
|
175
|
+
return flow_run
|
176
|
+
await anyio.sleep(poll_interval)
|
177
|
+
|
178
|
+
return flow_run
|