sogou / workflow

C++ Parallel Computing and Asynchronous Networking Framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Server等待第三方API调用的问题

tothedistance opened this issue · comments

调用一个芯片sdk的api,api带timeout参数。我不知道内部是否有wait一类的东西。用threadtask应该是不行,文档里写了threadtask里面不能wait。
又或者有另一种api,你要先指定一个线程去调用process函数,然后async地发任务,任务计算完成就会在process函数里回调。
好像issue里面一些如repeatertask文档里都没写。所以这种async的需求有什么简洁优雅的实现方式么。

你sdk的api,是异步的吧?那么它应该也有一个类似callback的东西。你只需要在process里,用一个 counter 堵位series,然后在你sdk api的callback里打开这个counter就可以了。大概这样:

void api_callback(void *arg)
{
    WFCounterTask *counter = (WFCounterTask *)arg;
    counter->count();
}

void process(WFHttpTask *task)
{
    WFCounterTask *counter = WFTaskFactory::create_counter_task(1, nullptr);
    api->call(api_callback, counter);
    series_of(task)->push_back(counter);
}

第一种是同步的api,只是内部也是一种io。这个确实sdk没提供应该没办法。异步的我明白你的意思了。
第二中里面那个process回调的函数要自己poll。也是sdk没有提供异步通知的比较好的办法。

或许我标题取错了。基本上就是要不断去问好了没有好了没有。

如果你其它地方不需要用thread task/go task来进行计算,可以直接用计算线程池来等待你的任务。而且你还可以修改这个池子线程数。或者你自己搞个线程池也行,同样用counter task来唤醒process。
你也可以在process里用timer task来轮询,我们的timer task开销非常小。不过,这种情况下,如果轮询间隔太长,可能会有一定延迟。

就我api(timeout=10ms) 放进threadtask,应该也就卡主thread10ms吧,没有什么其他严重后果,该恢复恢复。

就我api(timeout=10ms) 放进threadtask,应该也就卡主thread10ms吧,没有什么其他严重后果,该恢复恢复。

对,没有什么别的影响。除非你还有其它的计算任务。

好的谢谢。