Comments (7)
I tried to outline your options in the documentation: https://tradias.github.io/asio-grpc/md_doc_using_asio_io_context.html
I recommend going for the Explicitly constructed io_context and Run on separate threads approach.
from asio-grpc.
If I run it on a separate thread, all my code will still run on the same thread (io_context
's thread). Is that correct? And only some internal agrpc will run on the other thread, right?
Thank you for your help.
from asio-grpc.
For co_spawn
+asio::use_awaitable
that is correct. Technically it depends on the completion handler executor, some details here: #88 (comment)
In your case you can also use the slightly more performant GrpcContext.run_completion_queue function.
from asio-grpc.
@Tradias
Is agrpc::ClientRPC::request
thread-safe?
I have a agrpc::GrpcContext
and the only work I do on it is agrpc::ClientRPC::request
. If I call agrpc::GrpcContext::run
from multiple threads, that means the request
calls can get executed in parallel, right? Is it safe, assuming I call request
with the same grpc_context
and stub
multiple times (but different ClientContext
, request
, and response
)?
from asio-grpc.
GrpcContext::run may only be called from one thread at a time. For a multi-threaded client you want to create multiple GrpcContexts and then pick one (using some strategy) whenever you do a ClientRPC::request
. See also this example: https://github.com/Tradias/asio-grpc/blob/master/example/multi-threaded-client.cpp
I was thinking of introducing a agrpc::GrpcContextPool
class that encapsulate the round robing strategy shown in the example to make it possible to write something like:
grpc::ServerBuilder server_builder;
int num_threads = 5;
agrpc::GrpcContextPool pool{server_builder, num_threads};
ClientRPC::request(grpc_context_pool, ...);
pool.run();
What do you think?
Choosing to limit a GrpcContext (aka. grpc::CompletionQueue
) to one thread was done due to the performance recommendation here https://grpc.io/docs/guides/performance/
If having to use the async completion-queue API, the best scalability trade-off is having numcpu’s threads. The ideal number of completion queues in relation to the number of threads can change over time (as gRPC C++ evolves), but as of gRPC 1.41 (Sept 2021), using 2 threads per completion queue seems to give the best performance.
from asio-grpc.
I expected it to be like io_context
, but that would be nice too.
So if I use a different GrpcContext
but the same stub
, would that be thread safe?
from asio-grpc.
Yes, reusing the stub
for multiple GrpcContexts is safe and preferred.
Allowing GrpcContext::run to be called from multiple threads is a significant effort and runtime overhead. Also for asio::io_context
. Every user has to pay that cost even if they use the more efficient approach of having one context per thread.
from asio-grpc.
Related Issues (20)
- Provide operator bool to check the validity of ServerPRCPtr HOT 1
- Question: add sender after run HOT 1
- simple program stuck HOT 2
- Using asynchronous gRPC server and client on same context HOT 9
- Asio-gRPC seems to have TSAN warnings HOT 8
- How to detect client closed connection HOT 6
- Can I call ServerBuilder::BuildAndStart() after GrpcContext::run() HOT 2
- Questions on how to switch from an GrpcContext to io_context and back HOT 6
- How to shutdown grpc clients HOT 1
- Clarification Needed on Thread Context Switch in writer() Function (example streaming-server.cpp) HOT 8
- assertion failed: !started_ HOT 2
- The agrpc::GrpcContext hangs forever HOT 13
- an upgrade from 2.5.1 to 2.9.1 leads to build errors HOT 6
- build fails with latest boost 1.84 HOT 4
- [Question]: Slowly receiveing client in long-lived streaming HOT 1
- InvokeHandler conflicts with Objective-C/C++ defines HOT 1
- Need some basic help! HOT 9
- How to make grPC Client to Establish connection based on IP address? HOT 2
- Update conan package to 3.0.0 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from asio-grpc.