创建异步风格 API 接口的最佳实践? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
w568w

创建异步风格 API 接口的最佳实践?

  •  1
     
  •   w568w
    w568w Jul 17, 2024 2260 views
    This topic created in 659 days ago, the information mentioned may be changed or developed.

    正在编写一个网络协议实现及其前端,主要是关于收发文件的。因为前端可能是 Dart ( Flutter )、Swift 或 TypeScript ( ArkTS ),一方面不想重复造轮子,另一方面是 Dart 的性能不够高,实测相比原生,用 Dart 实现协议对传输速度有很大影响,所以决定把后端的协议实现抽象成几个 FFI 接口,用 C++ 或者 Rust 来写,包装成 .so,允许前端调用。

    但是,因为目前想把协议库设计为直接处理各种网络(以及文件) I/O ,这些耗时操作必然不应该阻塞调用者的主线程(另外,Dart 和 TypeScript 开启新线程也很麻烦,不能要求他们去开)。如果要异步的话,我也不是很清楚具体怎么做比较好。

    我目前的想法是,像 MPI 那样设计成:

    1. call_something_nonblocking(&request)(不阻塞发起请求)
    2. wait_req(request)(阻塞到请求完成)
    3. get_req_status_nonblocking(request)(获取请求的进行状态)

    或者是:

    call_something(&request, callback)(回调式发起请求。跨语言传递回调是不是比较难实现? TS 似乎不支持跨线程调用 ts 方面的函数。)

    不知各位有没有更成熟的设计模式?

    3 replies    2024-07-17 13:51:50 +08:00
    zhuangzhuang1988
        1
    zhuangzhuang1988  
       Jul 17, 2024   1
    你这个很想微软的 APM 模型 https://learn.microsoft.com/zh-cn/dotnet/standard/asynchronous-programming-patterns/asynchronous-programming-model-apm
    可以讲这种模型包装成 async await 的
    weijancc
        2
    weijancc  
       Jul 17, 2024
    偏个题, 我好奇你题中的 ArkTS, 搜了下有点难绷, 加了 3 个新特性就等于一门新语言了
    w568w
        3
    w568w  
    OP
       Jul 17, 2024
    @zhuangzhuang1988 感谢推荐。我看了一下,好像和 MPI 的设计差不多:异步启动,创建一个 handle (&request ),后续靠这个 handle 去获取执行信息或者终止/等待任务运行。

    @weijancc 严格来说 ArkTS 应该是一个框架而不是一门语言,所以和 Flutter 列在一起。当然,这不妨碍它烂,华为对 typescript node API 做的事和微信小程序对 Javascript 生态做的事一样,主打一个添乱、阉割、碎片化。
    About     Help     Advertise     Blog     API     FAQ     Solana     1150 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 23:22 PVG 07:22 LAX 16:22 JFK 19:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86