首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RXCPP:阻塞函数的超时

RXCPP:阻塞函数的超时
EN

Stack Overflow用户
提问于 2017-07-12 07:31:29
回答 1查看 762关注 0票数 4

考虑一个阻塞函数:this_thread::sleep_for(毫秒(3000));

我试图得到以下行为:

代码语言:javascript
复制
Trigger Blocking Function               

|---------------------------------------------X

我想触发阻塞函数,如果时间太长(超过2秒),就应该超时。

我做了以下工作:

代码语言:javascript
复制
my_connection = observable<>::create<int>([](subscriber<int> s) {
    auto s2 = observable<>::just(1, observe_on_new_thread()) |
    subscribe<int>([&](auto x) {
        this_thread::sleep_for(milliseconds(3000));
        s.on_next(1);
    });
}) |
timeout(seconds(2), observe_on_new_thread());

我不能让它起作用。首先,我认为S不能从另一个线程中on_next。

所以我的问题是,正确的反应方式是什么?如何在rxcpp中包装阻塞函数并向其添加超时?

随后,我想获得一个行为如下的RX流:

代码语言:javascript
复制
Trigger                Cleanup

|------------------------X
                           (Delay)   Trigger           Cleanup
                                       |-----------------X
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-12 18:40:42

问得好!上面的情况非常接近。

下面是如何将阻塞操作调整到rxcpp的示例。它使用libcurl轮询来发出http请求。

以下是你想做的事。

代码语言:javascript
复制
auto sharedThreads = observe_on_event_loop();

auto my_connection = observable<>::create<int>([](subscriber<int> s) {
        this_thread::sleep_for(milliseconds(3000));
        s.on_next(1);
        s.on_completed();
    }) |
    subscribe_on(observe_on_new_thread()) |
    //start_with(0) | // workaround bug in timeout
    timeout(seconds(2), sharedThreads);
    //skip(1); // workaround bug in timeout

my_connection.as_blocking().subscribe(
    [](int){}, 
    [](exception_ptr ep){cout << "timed out" << endl;}
);
  • subscribe_on将在一个专用线程上运行create,因此允许create阻塞该线程。
  • on_next/on_error/on_completed将在另一个线程上运行定时器,这个线程可以与其他线程共享,并将所有的timeout调用传输到同一个线程。
  • as_blocking将确保subscribe在完成之前不会返回。这只用于防止main()退出--通常是在测试或示例程序中。

编辑:为timeout中的bug添加了解决方法。目前,在第一个值到达之前,它不会安排第一个超时。

编辑2:timeout错误已经修复,解决方案不再需要了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45051166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档