ChunelFeng / CGraph

【A common used C++ DAG framework】 一个通用的、无三方依赖的、跨平台的、收录于awesome-cpp的、基于流图的并行计算框架。欢迎star & fork & 交流
http://www.chunel.cn
MIT License
1.77k stars 322 forks source link

期望有一个notify ASYNC EVENT的实例! #357

Closed myseemylife closed 7 months ago

myseemylife commented 7 months ago

看了examples和tutorial,但还是不太理解ASYNC EVENT的应用场景。

myseemylife commented 7 months ago

另外,异步事件目前被设计成pipeline结束或者destroy前在内部统一等待。是否可以给具体的Event开放waitAsyncResult的接口呢?

ChunelFeng commented 7 months ago

看了examples和tutorial,但还是不太理解ASYNC EVENT的应用场景。

你好,异步事件,主要是为了方便实现一些埋点逻辑,比如,走到某个特定的判断逻辑, 我需要给 redis 上的一个 key 值做 +1操作

如果用同步的话,需要等 redis的请求返回,会阻塞 后面的逻辑执行,故设计了 异步事件的逻辑

ChunelFeng commented 7 months ago

异步 event 主要是为了和 同步的event触发方式保持一致,故返回 CStatus状态,表示是否有触发,而没有关注触发执行的结果。 如果给 event 添加了 waitAsyncResult()方法,如果在一个地方被异步触发两次,就可能会有语义上的歧义

如果您需要用异步的逻辑执行,并且想在您指定的位置等待完成的话, 可以考虑使用 node(设定超时) + GFence 的逻辑

myseemylife commented 7 months ago

设想如下场景:有一个ANode,里面是io 操作去获取一段buffer,这个node会repeate N次,node内的io操作限制只能串行。 期望io和buffer的解析计算可以并行,所以设计了一个ASync Event,在每次io完毕后直接notify(“parse_buffer”,GEventType::Async); 这个node执行完毕后,需要在下一个node中等待,并且获取解析结果。

上述ANode描述的过程 也希望可以并行: ANode --- io--notify, io--notify,...... getResult ANode --- io--notify, io--notify,...... getResult ANode --- io--notify, io--notify,...... getResult

初次学习CGraph,对框架代码和设计抽象的理念理解的不好,不知道上述过程怎么处理会更好?

ChunelFeng commented 7 months ago

哈哈,已经是比较复杂的场景了。

如果是 io 和 parser 流程,可以串行的话,建议使用 isHold() 的逻辑, 具体代码参考这里:https://github.com/ChunelFeng/CGraph/blob/main/tutorial/T14-Hold.cpp

如果一定要 io 和 parser的逻辑,形成一个流水线并行的关系的话, 不建议使用 异步event,强烈建议使用CGraph中提供的 message 机制。 思路是将 io 和 parser 拆分成两个node,之间通过 message来进行交互通知和传递参数,

这样,可以完成您 在 io第二次的时候, parser第一次 io 的结果类似的操作 ps:message机制中,支持 zero copy 的传递方式您的 buffer信息

参考代码: https://github.com/ChunelFeng/CGraph/blob/main/tutorial/T16-MessageSendRecv.cpp (跨pipeline) 或者: https://github.com/ChunelFeng/CGraph/blob/main/example/E03-ThirdFlow.cpp (同一pipeline)

myseemylife commented 7 months ago

感谢指导~我试试