Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
dynamo
Commits
fe164d72
Unverified
Commit
fe164d72
authored
Apr 28, 2025
by
Biswa Panda
Committed by
GitHub
Apr 28, 2025
Browse files
feat: replace async queue with async iter and double decorator (#858)
parent
ee2c5938
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
19 additions
and
62 deletions
+19
-62
deploy/dynamo/sdk/src/dynamo/sdk/lib/dependency.py
deploy/dynamo/sdk/src/dynamo/sdk/lib/dependency.py
+19
-62
No files found.
deploy/dynamo/sdk/src/dynamo/sdk/lib/dependency.py
View file @
fe164d72
...
@@ -22,6 +22,7 @@ from typing import Any, Dict, Optional, TypeVar
...
@@ -22,6 +22,7 @@ from typing import Any, Dict, Optional, TypeVar
from
_bentoml_sdk.service
import
Service
from
_bentoml_sdk.service
import
Service
from
_bentoml_sdk.service.dependency
import
Dependency
from
_bentoml_sdk.service.dependency
import
Dependency
from
dynamo.runtime
import
DistributedRuntime
from
dynamo.sdk.lib.service
import
DynamoService
from
dynamo.sdk.lib.service
import
DynamoService
T
=
TypeVar
(
"T"
)
T
=
TypeVar
(
"T"
)
...
@@ -47,75 +48,31 @@ class DynamoClient:
...
@@ -47,75 +48,31 @@ class DynamoClient:
if
name
not
in
self
.
_dynamo_clients
:
if
name
not
in
self
.
_dynamo_clients
:
namespace
,
component_name
=
self
.
_service
.
dynamo_address
()
namespace
,
component_name
=
self
.
_service
.
dynamo_address
()
# Create async generator function that
uses Queue for
stream
ing
# Create async generator function that
directly yields from the
stream
async
def
get_stream
(
*
args
,
**
kwargs
):
async
def
get_stream
(
*
args
,
**
kwargs
):
queue
:
asyncio
.
Queue
=
asyncio
.
Queue
()
if
self
.
_runtime
is
not
None
:
if
self
.
_runtime
is
not
None
:
# Use existing runtime if available
# Use existing runtime if available
async
def
stream_worker
():
runtime
=
self
.
_runtime
try
:
client
=
(
await
self
.
_runtime
.
namespace
(
namespace
)
.
component
(
component_name
)
.
endpoint
(
name
)
.
client
()
)
# TODO: Potentially model dump for a user here so they can pass around Pydantic models
stream
=
await
client
.
generate
(
*
args
,
**
kwargs
)
async
for
item
in
stream
:
data
=
item
.
data
()
await
queue
.
put
(
data
)
await
queue
.
put
(
None
)
except
Exception
:
await
queue
.
put
(
None
)
raise
else
:
else
:
# Create dynamo worker if no runtime
# Create new runtime and store it
from
dynamo.runtime
import
DistributedRuntime
,
dynamo_worker
loop
=
asyncio
.
get_running_loop
()
runtime
=
DistributedRuntime
(
loop
,
False
)
@
dynamo_worker
()
self
.
_runtime
=
runtime
async
def
stream_worker
(
runtime
:
DistributedRuntime
):
try
:
# Store runtime for future use
self
.
_runtime
=
runtime
client
=
(
await
runtime
.
namespace
(
namespace
)
.
component
(
component_name
)
.
endpoint
(
name
)
.
client
()
)
stream
=
await
client
.
generate
(
*
args
,
**
kwargs
)
async
for
item
in
stream
:
data
=
item
.
data
()
await
queue
.
put
(
data
)
await
queue
.
put
(
None
)
except
Exception
:
await
queue
.
put
(
None
)
raise
# Start worker task with error handling
worker_task
=
asyncio
.
create_task
(
stream_worker
())
try
:
try
:
# Yield items from queue until None received
client
=
(
while
True
:
await
runtime
.
namespace
(
namespace
)
item
=
await
queue
.
get
()
.
component
(
component_name
)
if
item
is
None
:
.
endpoint
(
name
)
break
.
client
()
yield
item
)
finally
:
# Directly yield items from the stream
try
:
stream
=
await
client
.
generate
(
*
args
,
**
kwargs
)
await
worker_task
async
for
item
in
stream
:
except
Exception
:
yield
item
.
data
()
raise
except
Exception
as
e
:
raise
e
self
.
_dynamo_clients
[
name
]
=
get_stream
self
.
_dynamo_clients
[
name
]
=
get_stream
return
self
.
_dynamo_clients
[
name
]
return
self
.
_dynamo_clients
[
name
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment