acl-dev / acl

C/C++ server and network library, including coroutine,redis client,http/https/websocket,mqtt, mysql/postgresql/sqlite client with C/C++ for Linux, Android, iOS, MacOS, Windows, etc..
https://acl-dev.cn
GNU Lesser General Public License v3.0
2.88k stars 936 forks source link

get_message 的超时时间设为0,表现为无限阻塞 #253

Closed szn409 closed 2 years ago

szn409 commented 2 years ago

#include <string>
#include "./include/mfo/acl_redis/acl_redis.hpp"

using std::string;

int main()
{
    acl::acl_cpp_init();

    acl::redis_client redis_client("127.0.0.1:6379", 3, 0);

    acl::redis_pubsub redis(&redis_client);
    redis.subscribe("szn", nullptr);

    acl::string str_channel;
    acl::string str_value;

    //除非我使用redis客户端向频道 szn 进行 publish,否则 get_message 一直阻塞
    redis.get_message(str_channel, str_value, nullptr, nullptr, 0);

    std::cout << str_channel.c_str() << " " << str_value.c_str() << std::endl;

    std::cout << "finish" << std::endl;

    return 0;
}```

如何才能实现一个非阻塞的 get_message
zhengshuxin commented 2 years ago

目前 acl 的 redis 模块通信过程都是阻塞的,没提供非阻塞模式,你可以使用 acl 的 aio 模块(非阻塞通信模块)实现一个。

szn409 commented 2 years ago

感谢您的回复,目前get_message的最小阻塞等待时间是否就是1秒

zhengshuxin commented 2 years ago

是的,因为超时的单位为秒。

szn409 commented 2 years ago

感谢您的回复,您之前提到了使用 acl 的 aio 模块,实现非阻塞的 get_message,因为我刚接触 acl,不知道您是否方便给个demo,帮助我实现非阻塞的 get_message

zhengshuxin commented 2 years ago

https://github.com/acl-dev/demo/tree/master/c%2B%2B/nio 这儿有简单的例子,可结合博客:https://blog.csdn.net/zsxxsz/article/details/88388370 了解一下如何使用 acl aio 模块。另外,还可以在 https://github.com/acl-dev/acl/tree/master/lib_acl_cpp/samples/aio 处找到更多例子。aio 的类在 https://github.com/acl-dev/acl/tree/master/lib_acl_cpp/include/acl_cpp/stream 下以 aio_ 开头的文件中。

szn409 commented 2 years ago

非常感谢您的技术支持