mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-09-20 08:37:59 +02:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8225701511 |
@@ -156,7 +156,12 @@ class AsyncPostgresStore(AsyncBatchedBaseStore, BasePostgresStore[_ainternal.Con
|
|||||||
return results
|
return results
|
||||||
|
|
||||||
def batch(self, ops: Iterable[Op]) -> list[Result]:
|
def batch(self, ops: Iterable[Op]) -> list[Result]:
|
||||||
return asyncio.run_coroutine_threadsafe(self.abatch(ops), self.loop).result()
|
futures = []
|
||||||
|
for op in ops:
|
||||||
|
fut = self._loop.create_future()
|
||||||
|
self._aqueue[fut] = op
|
||||||
|
futures.append(fut)
|
||||||
|
return [fut.result() for fut in asyncio.as_completed(futures)]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@asynccontextmanager
|
@asynccontextmanager
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
# type: ignore
|
# type: ignore
|
||||||
|
import asyncio
|
||||||
import itertools
|
import itertools
|
||||||
import sys
|
import sys
|
||||||
import uuid
|
import uuid
|
||||||
from collections.abc import AsyncIterator
|
from collections.abc import AsyncIterator
|
||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
|
||||||
@@ -63,6 +65,96 @@ async def store(request) -> AsyncIterator[AsyncPostgresStore]:
|
|||||||
await conn.execute(f"DROP DATABASE {database}")
|
await conn.execute(f"DROP DATABASE {database}")
|
||||||
|
|
||||||
|
|
||||||
|
async def test_large_batches(store: AsyncPostgresStore) -> None:
|
||||||
|
N = 1000
|
||||||
|
M = 10
|
||||||
|
|
||||||
|
with ThreadPoolExecutor(max_workers=10) as executor:
|
||||||
|
for m in range(M):
|
||||||
|
for i in range(N):
|
||||||
|
_ = [
|
||||||
|
executor.submit(
|
||||||
|
store.put,
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
value={"foo": "bar" + str(i)},
|
||||||
|
),
|
||||||
|
executor.submit(
|
||||||
|
store.get,
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
),
|
||||||
|
executor.submit(
|
||||||
|
store.list_namespaces,
|
||||||
|
prefix=None,
|
||||||
|
max_depth=m + 1,
|
||||||
|
),
|
||||||
|
executor.submit(
|
||||||
|
store.search,
|
||||||
|
("test",),
|
||||||
|
),
|
||||||
|
executor.submit(
|
||||||
|
store.put,
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
value={"foo": "bar" + str(i)},
|
||||||
|
),
|
||||||
|
executor.submit(
|
||||||
|
store.put,
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
async def test_large_batches_async(store: AsyncPostgresStore) -> None:
|
||||||
|
N = 1000
|
||||||
|
M = 10
|
||||||
|
coros = []
|
||||||
|
for m in range(M):
|
||||||
|
for i in range(N):
|
||||||
|
coros.append(
|
||||||
|
store.aput(
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
value={"foo": "bar" + str(i)},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
coros.append(
|
||||||
|
store.aget(
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
coros.append(
|
||||||
|
store.alist_namespaces(
|
||||||
|
prefix=None,
|
||||||
|
max_depth=m + 1,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
coros.append(
|
||||||
|
store.asearch(
|
||||||
|
("test",),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
coros.append(
|
||||||
|
store.aput(
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
value={"foo": "bar" + str(i)},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
coros.append(
|
||||||
|
store.adelete(
|
||||||
|
("test", "foo", "bar", "baz", str(m % 2)),
|
||||||
|
f"key{i}",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
await asyncio.gather(*coros)
|
||||||
|
|
||||||
|
|
||||||
async def test_abatch_order(store: AsyncPostgresStore) -> None:
|
async def test_abatch_order(store: AsyncPostgresStore) -> None:
|
||||||
# Setup test data
|
# Setup test data
|
||||||
await store.aput(("test", "foo"), "key1", {"data": "value1"})
|
await store.aput(("test", "foo"), "key1", {"data": "value1"})
|
||||||
|
|||||||
Reference in New Issue
Block a user