Question related only Linux for my tasks.

I want to use EzRpcClient from several threads to send single server in 
another process.

I've tried to create EzRpcClient in one thread which I want to use only as 
messages sender thread. And then in each other threads I've created 
WaitScope and Capability (client->getMain<ClassName>). Then I create 
Request. And at send step I receive exception saying that there no Event 
Loop in current thread.

How to correcly do communications from threads?

>From my userstanding there several options but I don't know how to 
implement them.

1. Using one thread only as message sender thread.
So Sender thread have some kind of infinite Event Loop. 
I read somewhere here at Google Group old post about there() method of 
Promise. If it is exists in current version, I think it send event to 
Sender thread and wait until it finish processing so Worker thread is in 
blocking for time period.
If there() is not blocking how to make clone of all message data since I 
read in KJ style guide that Cap'n Proto does not own data so when Sender 
thread try to send data it no longer there.

Pros. One EzRpcClient instance and so one TCP connection to server.
Cons. Since only one message  send in time each Worker thread must wait 
until it's message will be sent.

2. Using one thread only as one-way message sender thread
In this case when I preparse Requests I will make clone of them and data it 
points to (say how to do this correctly in KJ style) and put them in the 
queue. Sender thread poll that queue from time to time and sends prepared 
Requests.
So questions in this case. How to correctly to clone request and its data 
and pass it ownship to Sender thread? In that case Worker can safely delete 
all data once it put it's clone to queue.
Pros. Worker does not wait answer so performance impact is only related to 
cloning data.
Cons. Workers can not receive any anwsers from server.

3. Using one EzRpcClient per thread.
In this case each EzRpcClient instance stored in thread local storage (e.g. 
using std::thread_local). Using each client instance is like in single 
threaded app. Easy.
Pros. Easier implementation.
Cons. Worker threads must wait for answer even I don't needed it 
(fire-and-forget). This is because messages send in Event Loop and it 
created in current thread so it will not work until I execute it using 
Request::wait(WaitScope).


How to implement each type in KJ style and what is considered best practice?
I have two types of communications. One-way is for CPU intensive tasks in 
Worker threads. And two-way in other Manager threads. I don't need to mix 
two communication types in single thread.

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at https://groups.google.com/group/capnproto.

Reply via email to