- 主题:最近在怒学coroutine
【 在 hgoldfish 的大作中提到: 】
: 对,我也觉得 coroutine 的实现很简单。关键在于理解 coroutine 的应用场景。经典的把 generator 用在编译器语法解析以及网络编程特别好用,不搞那些弯弯绕绕的 vistor/callback 模式。把 coroutine 用在 gui 编程也特别好用——这个领域我看目前最强的可能是 c#. js 和 c++ 社区都是稀烂。
: 你说的那一套 modern http 把序列化和反序列化和 http client 耦合起来了,还有流式 API 是 rxjava 那个流派的玩法。事实上,我有一套使用 qt 反射自动序列化和反序列化的未开源模块。不过我不想把它们做到一块来。我做的是简洁友好API的 http client,不是高性能,也不是 modern http client. 目标是让人一看就懂,用起来不容易出错。
:
感觉你很排斥 Rx,但是似乎用的并不多
Rx 是一个信号,经过各种 operate 转化合并分拆变成另外一个信号,之后 subscribe
仅仅写法是流式写法,原理和侧重点都和上面的 http 请求不一样
Rxcpp用的人很少,主要因为c++里面,subscribe 之后的 lambda 中传入引用的生命周期非常难处理
但是用熟练的话,还是很好用的
--
FROM 211.249.40.*
赞。。开源了没有。。
不过我虽然玩 js/java 多年,还是没法接受在 cpp 里面搞那种风格的程序库哈。
我喜欢 python 风格:
auto r = http.get(url, {{"param1", "1"}, {"param2": "2"}});
return model<User>(r.json());
第二个参数。。经常写网络请求的都知道是 url query. 对于 post 则是 post body。传入 json 则是自动设置 json mime type. 这种约定俗成的规则只要一看就明白。需要更多的参数就自行构造 request 对象再 send() 也不是多大的事。
【 在 hanjiamajia (hanjiamajia) 的大作中提到: 】
: 这是我自用的
: 反序列化两种都支持
: 依赖Qt的话,需要全部 QObject 来启用元编程映射Q_PROPERTY
: ...................
--
修改:hgoldfish FROM 124.72.119.*
FROM 124.72.119.*
对啊。。我确实很不喜欢那种流式风格。窃以为那种风格只适用于 builder 模式:
auto builder = ComplicatedModule::Builder();
auto m = builder.param1(1).param2(2).create();
其它情况不应该滥用。
【 在 hanjiamajia (hanjiamajia) 的大作中提到: 】
: 感觉你很排斥 Rx,但是似乎用的并不多
: Rx 是一个信号,经过各种 operate 转化合并分拆变成另外一个信号,之后 subscribe
: 仅仅写法是流式写法,原理和侧重点都和上面的 http 请求不一样
: ...................
--
FROM 124.72.119.*
感谢分享
--
FROM 180.169.253.*
【 在 hgoldfish 的大作中提到: 】
: 赞。。开源了没有。。
: 不过我虽然玩 js/java 多年,还是没法接受在 cpp 里面搞那种风格的程序库哈。
: 我喜欢 python 风格:
: ...................
没有,公司内部项目的代码,没办法开源
--
FROM 199.19.107.*
我要有空就把 qtng 改成基于 c++20 coroutine.. qtng 是 2017 年开工的,那时候 boost::coroutine 非常难用
【 在 hanjiamajia (hanjiamajia) 的大作中提到: 】
: 没有,公司内部项目的代码,没办法开源
--
FROM 124.72.119.*
【 在 hgoldfish 的大作中提到: 】
: 我要有空就把 qtng 改成基于 c++20 coroutine.. qtng 是 2017 年开工的,那时候 boost::coroutine 非常难用
:
【 在 hgoldfish 的大作中提到: 】
: 我要有空就把 qtng 改成基于 c++20 coroutine.. qtng 是 2017 年开工的,那时候 boost::coroutine 非常难用
:
简单看了下你的 Http Client ,我想讨论下我看到的几个问题(不讨论协程部分):
1. HttpSession 没有找到 Cancel 机制
这个在 UI 开发中很重要,比如 Dialog 关闭,需要 Cancel 掉当前页面发出的所有 Http 请求
2. FormData 的 addFile(const QString &name, const QString &filename, const QByteArray &data, const QString &contentType = QString()) 接口设计的不太合理
上传一个大文件的话,把文件作为 QByteArray 全部加载到内存里是不能接受的
(这里用 QMimeDatabase 自动加载 Mime type 的设计不错)
3. setBody() 的设计不错, 通过参数类型设置 multipart/form-data application/json application/x-www-form-urlencoded
但是
a. 因为 post 接受的只是 QByteArray ,所以造成了问题2,可以改成 QDataStream 或者 std::basic_iostream
b. 除了内置的三个 content-type 之外,只提供了 setBody(const QByteArray &body) 一个通用方法(这里还遗漏了 content-type),使扩展性打了折扣
我想了想,感觉这里可以设计成这样的一个interface
struct post_body {
std::basic_iostream stream;
size64_t length;
std::string content_type;
};
class body_generator_interface {
public:
virtual post_body generator_body() = 0;
};
其他类型都继承该 interface 来实现。
然后真正 HttpSessionPrivate::send() 的时候,调用 generator_body() 来获取 content_type content-length 和 body stream
--
FROM 124.251.33.*
1. 直接 kill 整个 coroutine 就行了。包括超时也是如此:
workers.spawnWithName("load_data", [this] {
auto r = http.get(url);
update(model<Profile>(r.json());
}
on_cancel_button_clicked:
workers.kill("load_data");
qtng::Timeout timeout(10);
try {
auto r = http.get(url);
...
} catch (qtng::TimeoutException &e) {
// timeout
}
2.3. 这个目前确实还没有实现。我设计了一个 FileLike 类型用于模拟大文件,等我有空就加进去。
【 在 hanjiamajia (hanjiamajia) 的大作中提到: 】
: 简单看了下你的 Http Client ,我想讨论下我看到的几个问题(不讨论协程部分):
: 1. HttpSession 没有找到 Cancel 机制
: 这个在 UI 开发中很重要,比如 Dialog 关闭,需要 Cancel 掉当前页面发出的所有 Http 请求
: ...................
--
修改:hgoldfish FROM 112.47.122.*
FROM 112.47.122.*
【 在 hgoldfish 的大作中提到: 】
: 1. 直接 kill 整个 coroutine 就行了。包括超时也是如此:
: workers.spawnWithName("load_data", [this] {
: auto r = http.get(url);
: ...................
--
FROM 124.251.33.*
求评价一下qt6里的coroutine:
https://www.qt.io/blog/asynchronous-apis-in-qt-6
【 在 hgoldfish 的大作中提到: 】
: 1. 直接 kill 整个 coroutine 就行了。包括超时也是如此:
:
: workers.spawnWithName("load_data", [this] {
: ....................
--
FROM 59.5.43.*