prefect-client 2.18.2__py3-none-any.whl → 2.18.3__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/engine.py +17 -1
- prefect/new_flow_engine.py +40 -4
- {prefect_client-2.18.2.dist-info → prefect_client-2.18.3.dist-info}/METADATA +1 -1
- {prefect_client-2.18.2.dist-info → prefect_client-2.18.3.dist-info}/RECORD +7 -7
- {prefect_client-2.18.2.dist-info → prefect_client-2.18.3.dist-info}/LICENSE +0 -0
- {prefect_client-2.18.2.dist-info → prefect_client-2.18.3.dist-info}/WHEEL +0 -0
- {prefect_client-2.18.2.dist-info → prefect_client-2.18.3.dist-info}/top_level.txt +0 -0
prefect/engine.py
CHANGED
@@ -163,6 +163,7 @@ from prefect.logging.loggers import (
|
|
163
163
|
from prefect.results import ResultFactory, UnknownResult
|
164
164
|
from prefect.settings import (
|
165
165
|
PREFECT_DEBUG_MODE,
|
166
|
+
PREFECT_EXPERIMENTAL_ENABLE_NEW_ENGINE,
|
166
167
|
PREFECT_TASK_INTROSPECTION_WARN_THRESHOLD,
|
167
168
|
PREFECT_TASKS_REFRESH_CACHE,
|
168
169
|
PREFECT_UI_URL,
|
@@ -189,6 +190,7 @@ from prefect.utilities.annotations import allow_failure, quote, unmapped
|
|
189
190
|
from prefect.utilities.asyncutils import (
|
190
191
|
gather,
|
191
192
|
is_async_fn,
|
193
|
+
run_sync,
|
192
194
|
sync_compatible,
|
193
195
|
)
|
194
196
|
from prefect.utilities.callables import (
|
@@ -2433,7 +2435,21 @@ if __name__ == "__main__":
|
|
2433
2435
|
exit(1)
|
2434
2436
|
|
2435
2437
|
try:
|
2436
|
-
|
2438
|
+
if PREFECT_EXPERIMENTAL_ENABLE_NEW_ENGINE.value():
|
2439
|
+
from prefect.new_flow_engine import (
|
2440
|
+
load_flow_and_flow_run,
|
2441
|
+
run_flow,
|
2442
|
+
run_flow_sync,
|
2443
|
+
)
|
2444
|
+
|
2445
|
+
flow_run, flow = run_sync(load_flow_and_flow_run)
|
2446
|
+
# run the flow
|
2447
|
+
if flow.isasync:
|
2448
|
+
run_sync(run_flow(flow, flow_run=flow_run))
|
2449
|
+
else:
|
2450
|
+
run_flow_sync(flow, flow_run=flow_run)
|
2451
|
+
else:
|
2452
|
+
enter_flow_run_engine_from_subprocess(flow_run_id)
|
2437
2453
|
except Abort as exc:
|
2438
2454
|
engine_logger.info(
|
2439
2455
|
f"Engine execution of flow run '{flow_run_id}' aborted by orchestrator:"
|
prefect/new_flow_engine.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import asyncio
|
2
2
|
import inspect
|
3
|
+
import os
|
3
4
|
from contextlib import AsyncExitStack, asynccontextmanager, contextmanager
|
4
5
|
from dataclasses import dataclass
|
5
6
|
from typing import (
|
@@ -10,22 +11,26 @@ from typing import (
|
|
10
11
|
Iterable,
|
11
12
|
Literal,
|
12
13
|
Optional,
|
14
|
+
Tuple,
|
13
15
|
TypeVar,
|
14
16
|
Union,
|
15
17
|
cast,
|
16
18
|
)
|
19
|
+
from uuid import UUID
|
17
20
|
|
18
21
|
import anyio
|
19
22
|
import anyio._backends._asyncio
|
20
23
|
from sniffio import AsyncLibraryNotFoundError
|
21
24
|
from typing_extensions import ParamSpec
|
22
25
|
|
23
|
-
from prefect import
|
26
|
+
from prefect import Task, get_client
|
24
27
|
from prefect.client.orchestration import PrefectClient
|
25
28
|
from prefect.client.schemas import FlowRun, TaskRun
|
26
29
|
from prefect.client.schemas.filters import FlowRunFilter
|
27
30
|
from prefect.client.schemas.sorting import FlowRunSort
|
28
31
|
from prefect.context import FlowRunContext
|
32
|
+
from prefect.deployments import load_flow_from_flow_run
|
33
|
+
from prefect.flows import Flow, load_flow_from_entrypoint
|
29
34
|
from prefect.futures import PrefectFuture, resolve_futures_to_states
|
30
35
|
from prefect.logging.loggers import flow_run_logger
|
31
36
|
from prefect.results import ResultFactory
|
@@ -49,16 +54,34 @@ P = ParamSpec("P")
|
|
49
54
|
R = TypeVar("R")
|
50
55
|
|
51
56
|
|
57
|
+
async def load_flow_and_flow_run(flow_run_id: UUID) -> Tuple[FlowRun, Flow]:
|
58
|
+
## TODO: add error handling to update state and log tracebacks
|
59
|
+
entrypoint = os.environ.get("PREFECT__FLOW_ENTRYPOINT")
|
60
|
+
|
61
|
+
async with get_client() as client:
|
62
|
+
flow_run = await client.read_flow_run(flow_run_id)
|
63
|
+
flow = (
|
64
|
+
load_flow_from_entrypoint(entrypoint)
|
65
|
+
if entrypoint
|
66
|
+
else await load_flow_from_flow_run(flow_run, client=client)
|
67
|
+
)
|
68
|
+
return flow_run, flow
|
69
|
+
|
70
|
+
|
52
71
|
@dataclass
|
53
72
|
class FlowRunEngine(Generic[P, R]):
|
54
|
-
flow: Union[Flow[P, R], Flow[P, Coroutine[Any, Any, R]]]
|
73
|
+
flow: Optional[Union[Flow[P, R], Flow[P, Coroutine[Any, Any, R]]]] = None
|
55
74
|
parameters: Optional[Dict[str, Any]] = None
|
56
75
|
flow_run: Optional[FlowRun] = None
|
76
|
+
flow_run_id: Optional[UUID] = None
|
57
77
|
_is_started: bool = False
|
58
78
|
_client: Optional[PrefectClient] = None
|
59
79
|
short_circuit: bool = False
|
60
80
|
|
61
81
|
def __post_init__(self):
|
82
|
+
if self.flow is None and self.flow_run_id is None:
|
83
|
+
raise ValueError("Either a flow or a flow_run_id must be provided.")
|
84
|
+
|
62
85
|
if self.parameters is None:
|
63
86
|
self.parameters = {}
|
64
87
|
|
@@ -304,6 +327,18 @@ class FlowRunEngine(Generic[P, R]):
|
|
304
327
|
self._client = client
|
305
328
|
self._is_started = True
|
306
329
|
|
330
|
+
# this conditional is engaged whenever a run is triggered via deployment
|
331
|
+
if self.flow_run_id and not self.flow:
|
332
|
+
self.flow_run = await client.read_flow_run(self.flow_run_id)
|
333
|
+
try:
|
334
|
+
self.flow = await self.load_flow(client)
|
335
|
+
except Exception as exc:
|
336
|
+
await self.handle_exception(
|
337
|
+
exc,
|
338
|
+
msg="Failed to load flow from entrypoint.",
|
339
|
+
)
|
340
|
+
self.short_circuit = True
|
341
|
+
|
307
342
|
if not self.flow_run:
|
308
343
|
self.flow_run = await self.create_flow_run(client)
|
309
344
|
|
@@ -373,8 +408,9 @@ class FlowRunEngine(Generic[P, R]):
|
|
373
408
|
|
374
409
|
|
375
410
|
async def run_flow(
|
376
|
-
flow: Flow[P, Coroutine[Any, Any, R]],
|
411
|
+
flow: Optional[Flow[P, Coroutine[Any, Any, R]]] = None,
|
377
412
|
flow_run: Optional[FlowRun] = None,
|
413
|
+
flow_run_id: Optional[UUID] = None,
|
378
414
|
parameters: Optional[Dict[str, Any]] = None,
|
379
415
|
wait_for: Optional[Iterable[PrefectFuture[A, Async]]] = None,
|
380
416
|
return_type: Literal["state", "result"] = "result",
|
@@ -385,7 +421,7 @@ async def run_flow(
|
|
385
421
|
We will most likely want to use this logic as a wrapper and return a coroutine for type inference.
|
386
422
|
"""
|
387
423
|
|
388
|
-
engine = FlowRunEngine[P, R](flow, parameters, flow_run)
|
424
|
+
engine = FlowRunEngine[P, R](flow, parameters, flow_run, flow_run_id)
|
389
425
|
|
390
426
|
# This is a context manager that keeps track of the state of the flow run.
|
391
427
|
async with engine.start() as run:
|
@@ -5,14 +5,14 @@ prefect/agent.py,sha256=HaGT0yh3fciluYpO99dVHo_LHq7N2cYLuWNrEV_kPV8,27789
|
|
5
5
|
prefect/artifacts.py,sha256=mreaBE4qMoXkjc9YI-5cAxoye7ixraHB_zr8GTK9xPU,8694
|
6
6
|
prefect/automations.py,sha256=rjVtQblBlKhD_q24bG6zbxJeb_XQJnodMlhr565aZJY,4853
|
7
7
|
prefect/context.py,sha256=BMT8VbI5OmQPFll6I5BlP5lZYn8IoxFsuRjjkqu7wK4,18144
|
8
|
-
prefect/engine.py,sha256=
|
8
|
+
prefect/engine.py,sha256=iDzMZRwB_avmftGVxCJwO4ezW-faLpaoTxeGLWNXqKY,90406
|
9
9
|
prefect/exceptions.py,sha256=Fyl-GXvF9OuKHtsyn5EhWg81pkU1UG3DFHsI1JzhOQE,10851
|
10
10
|
prefect/filesystems.py,sha256=XniPSdBAqywj43X7GyfuWJQIbz07QJ5Y3cVNLhIF3lQ,35260
|
11
11
|
prefect/flow_runs.py,sha256=mFHLavZk1yZ62H3UazuNDBZWAF7AqKttA4rMcHgsVSw,3119
|
12
12
|
prefect/flows.py,sha256=eAn4sGqGHG8afpjMIDOwY1xl5CciioYIYB5v8fsrwc0,71253
|
13
13
|
prefect/futures.py,sha256=RaWfYIXtH7RsWxQ5QWTTlAzwtVV8XWpXaZT_hLq35vQ,12590
|
14
14
|
prefect/manifests.py,sha256=sTM7j8Us5d49zaydYKWsKb7zJ96v1ChkLkLeR0GFYD8,683
|
15
|
-
prefect/new_flow_engine.py,sha256=
|
15
|
+
prefect/new_flow_engine.py,sha256=OyKq0ngvQMWajCESfUsTu15mARv3zoM7sC6kP2uBm-w,17649
|
16
16
|
prefect/new_task_engine.py,sha256=orLK-RPeJleJ5ID5zKRk-g0TQFtxT_qSTCvOK775pKU,17458
|
17
17
|
prefect/plugins.py,sha256=0C-D3-dKi06JZ44XEGmLjCiAkefbE_lKX-g3urzdbQ4,4163
|
18
18
|
prefect/profiles.toml,sha256=Fs8hD_BdWHZgAijgk8pK_Zx-Pm-YFixqDIfEP6fM-qU,38
|
@@ -284,8 +284,8 @@ prefect/workers/block.py,sha256=5bdCuqT-4I-et_8ZLG2y1AODzYiCQwFiivhdt5NMEog,7635
|
|
284
284
|
prefect/workers/process.py,sha256=JkmG-juTiVR6acy1t29NkTdLgp5p5VbBHA-2dCCOdv4,10094
|
285
285
|
prefect/workers/server.py,sha256=WVZJxR8nTMzK0ov0BD0xw5OyQpT26AxlXbsGQ1OrxeQ,1551
|
286
286
|
prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
|
287
|
-
prefect_client-2.18.
|
288
|
-
prefect_client-2.18.
|
289
|
-
prefect_client-2.18.
|
290
|
-
prefect_client-2.18.
|
291
|
-
prefect_client-2.18.
|
287
|
+
prefect_client-2.18.3.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
|
288
|
+
prefect_client-2.18.3.dist-info/METADATA,sha256=OTl_Gv2PvAeIT0Cc0nDWRRxdA16Ro2ZSlEulpPdfu7o,7401
|
289
|
+
prefect_client-2.18.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
290
|
+
prefect_client-2.18.3.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
|
291
|
+
prefect_client-2.18.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|