Konrad Grochowski created THRIFT-2075:
-----------------------------------------

             Summary: C++ async client project
                 Key: THRIFT-2075
                 URL: https://issues.apache.org/jira/browse/THRIFT-2075
             Project: Thrift
          Issue Type: Improvement
          Components: C++ - Library
            Reporter: Konrad Grochowski


What do you think about such iface for async c++ client?
{code}
service Serv
{
  X fun(1: Y y)
}
{code}
{code}
class ServAsyncClient
{
  boost::future<X> fun(const Y& y);
};
{code}

it could be implemented as a wrapper around "normal" client - just a blocking 
queue of boost::package_tasks and one thread executing it one by one.
This would work best with C++11 support (move semantics and lambdas could be 
used).

I've made wrapper for generated clients but such wrapper requires a lot of hand 
work ;)

example:
{code}
class AsyncClient
{
 public:
   AsyncClient(SyncClient* cli)
     : cli(cli) {}

  boost::future<X> fun(const Y& y)
  {
    addTask([this, y]() { return cli->fun(y); });
  }

private:
   blocking_queue<boost::function<void()> queue;

   template<typename Functor>
   boost::future<typename boost::result_of<Functor()>::type>
   addTask(Functor&& functor)
   {
      typedef typename boost::result_of<Functor()>::type result_type;
      typedef typename boost::packaged_task<result_type> task_type;
      typedef typename boost::shared_ptr<task_type> ptr_type;

      ptr_type ptr(new boost::packaged_task<result_type>(std::move(functor)));
      auto f = ptr->get_future();
      queue.push_back([ptr]{ (*ptr)(); });
      return f;
    }
 // ....
};
{code}

originally I used boost::asio, which enables me to schedules some tasks to be 
executed periodically (like ping) etc.

I haven't tested it yet enough but I could look into possibilities of adding 
new option to thrift compiler if such contribution would be anticipated ;)
I can also send my boost.asio based wrapper for anyone who would like to write 
own async wrapper 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to