добавил пример обработки данных, считанных из сокета, в пуле потоков и запись результата обратно в сокет (и все это в псевдолинейном стиле)
This commit is contained in:
parent
dcab8d1230
commit
efe4b8f50f
@ -7,28 +7,24 @@ session::session(boost::asio::io_service &io_service): boost::asio::coroutine(),
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
session::~session()
|
|
||||||
{
|
|
||||||
std::cout << "session destructor" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void session::start(boost::system::error_code ec, std::size_t bytes_transferred)
|
void session::start(boost::system::error_code ec, std::size_t bytes_transferred)
|
||||||
{
|
{
|
||||||
if(!ec)
|
if(!ec)
|
||||||
{
|
{
|
||||||
reenter(this) for(;;)
|
reenter(this) for(;;) // псевдолинейный код
|
||||||
{
|
{
|
||||||
std::memset(_data, 0, 128);
|
std::memset(_data, 0, 128);
|
||||||
yield _socket.async_read_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2));
|
yield _socket.async_read_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2));
|
||||||
std::cout << "async_read " << bytes_transferred << " bytes" << std::endl;
|
|
||||||
std::cout << "number: " << std::atoi(_data) << std::endl;
|
|
||||||
|
|
||||||
// yield _pool<int>.add_task([this]{
|
yield _fut = call_async<int>([this]{
|
||||||
// return 42;
|
int n = std::atoi(_data);
|
||||||
// });
|
return n*n;
|
||||||
|
});
|
||||||
|
|
||||||
yield _socket.async_write_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2));
|
yield {
|
||||||
std::cout << "async_write" << std::endl;
|
std::string res = std::to_string(_fut.get()) + "\n";
|
||||||
|
_socket.async_write_some(boost::asio::buffer(res), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@ -15,12 +15,23 @@ private:
|
|||||||
char _data[128];
|
char _data[128];
|
||||||
threadpool _pool;
|
threadpool _pool;
|
||||||
|
|
||||||
|
// "local" variables
|
||||||
|
std::future<int> _fut;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
session() = delete;
|
session() = delete;
|
||||||
session(session&) = delete;
|
session(session&) = delete;
|
||||||
session(boost::asio::io_service& io_service);
|
session(boost::asio::io_service& io_service);
|
||||||
void start(boost::system::error_code ec = boost::system::error_code(), std::size_t bytes_transferred = 0);
|
void start(boost::system::error_code ec = boost::system::error_code(), std::size_t bytes_transferred = 0);
|
||||||
~session();
|
|
||||||
|
template <typename R> std::future<R> call_async(std::function<R()> func)
|
||||||
|
{
|
||||||
|
return _pool.add_task<R>([this, &func]{
|
||||||
|
R result = func();
|
||||||
|
_socket.get_io_service().dispatch(std::bind(&session::start, this, boost::system::error_code(), 0));
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user