Skip to content

Commit 8e3ee4e

Browse files
authored
Merge pull request #53 from febus982/example_blocking_sync_routine
Add code example for thread worker routine
2 parents 855d099 + 54ff2ff commit 8e3ee4e

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

domains/books/_service.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from collections.abc import Iterable
22

3+
from anyio import to_thread
34
from dependency_injector.wiring import Provide, inject
45

56
from ._data_access_interfaces import BookRepositoryInterface
@@ -21,8 +22,21 @@ def __init__(
2122
self.book_repository = book_repository
2223

2324
async def create_book(self, book: BookData) -> Book:
24-
return Book.from_orm(await self.book_repository.save(BookModel(**book.dict())))
25+
# Example of CPU intensive task, run in a different thread
26+
# Using processes could be better, but it would bring technical complexity
27+
# https://anyio.readthedocs.io/en/3.x/subprocesses.html#running-functions-in-worker-processes
28+
book_data_altered = await to_thread.run_sync(
29+
some_cpu_intensive_blocking_task, book.dict()
30+
)
31+
book_model = BookModel(**book_data_altered)
32+
return Book.from_orm(await self.book_repository.save(book_model))
2533

2634
async def list_books(self) -> Iterable[Book]:
2735
books = await self.book_repository.find()
2836
return [Book.from_orm(x) for x in books]
37+
38+
39+
def some_cpu_intensive_blocking_task(book: dict) -> dict:
40+
# This is just an example placeholder,
41+
# there's nothing to test.
42+
return book # pragma: no cover

grpc_app/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ async def create_server(test_config: Optional[AppConfig] = None):
2323
add_BooksServicer_to_server(BooksServicer(), s)
2424
address = "0.0.0.0:9999"
2525
logger = get_logger()
26-
logger.ainfo(f"[{os.getpid()}] Listening on {address}")
26+
await logger.ainfo(f"[{os.getpid()}] Listening on {address}")
2727
s.add_insecure_port(address)
2828
return s
2929

poetry.lock

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)