话题:【讨论】用asio的stackfull coroutine还是纯回调方式来实现cinatra? | 知行一

【讨论】用asio的stackfull coroutine还是纯回调方式来实现cinatra?

首页 论坛 社区服务 【讨论】用asio的stackfull coroutine还是纯回调方式来实现cinatra?

该话题包含 2 个回复,有 3 个参与人,并且由  匿名 于 3 年, 1 月 前 最后一次更新。

正在查看 3 个帖子 - 1 至 3 (共计 3 条)
  • 作者
    帖子
  • #297

    macromad
    参与者

    在考虑cinatra的http server部分怎么实现的时候想到的这个问题,我个人倾向于用coroutine,主要原因有两个:
    1.写代码比较方便,而且看起来比较清晰
    这一点在群里就说过了,而且一般讨论异步编程的时候都会说到这个问题。比如说http server要提供一个文件下载功能,文件体积比较大,不能一下子读到内存中,要分段读然后发送,使用纯回调的方式代码格式一般如下:

    [/crayon]

    需要这么一大堆代码..看着都蛋疼,虽然用lambda之类的可以想办法简化一下,但也还是挺恶心的。用coroutine的话就好了,可以这么写:

    [/crayon]

    清晰度明显提升了很多。

    2.回调的方式有“传染性”,会使http server的接口变得难用
    因为http协议支持Transfer-Encoding:chunked这种分块传输方式,所以服务器段有可能每次只write一部分,分很多次write,如果用回调来实现,则会导致使用这个http server的api的时候也变成这种方式。简单来说就是response.write也得是异步回调的方式,想想就蛋疼,用coroutine就可以避免这个问题。当然也可以直接不支持分块发送,所有数据都保存到内存,不过这样就不能发送比较大的数据了。

    江南不想用coroutine的原因应该是因为他不成熟,担心有bug,不过我用过一段时间,貌似没什么太严重的bug,boost 1.56的时候好想有个bug是不能再两个编译单元中使用coroutine,否则有链接错误,后来改正了,另外听说在coroutine里面用com会有问题,我大概试了下貌似也没发现问题。

    所以说了这么一大堆,问题就是挖…不对,到底要不要用这个coroutine?

    #298

    qicosmos
    管理员

    coroutine在这种场景下应用很合适,在cinatra用coroutine没问题。

    #310

    匿名

    asio里面有一套机制, 可以让stackfull coroutine调用callback形式的代码(即包装以后, 回调代码可以接受yield参数, 并且阻塞coroutine).

正在查看 3 个帖子 - 1 至 3 (共计 3 条)

抱歉,回复话题必需登录。