在rust中重新编码c++任务队列.期货是正确的抽象概念吗



我正在rust中重写一个c++项目,作为我的第一个非微小rust程序。我想我应该从一段简单但关键的粗糙代码开始。

它是一个在特定时间运行的std::packaged_tasks队列。一位客户说

running_func_fut_ = bus_->TimerQueue().QueueTask(std::chrono::milliseconds(func_def.delay),
[this, func, &unit]()
{
func(this, &unit);
Done();
}, trace);

func是一个std::函数,但它们的关键点是,就队列而言,它是在排队一个lambda(用rust语言来说是闭包(

它返回一个std::future,客户端可以忽略或挂起它。如果他们坚持下去,他们可以看到任务是否已经完成。(它可能会返回一个结果,但在我当前的用例中,函数都是无效的,客户端只需要知道任务是否完成(。所有任务都在一个专用线程上运行。QueueTask方法将传递的lambda封装在一个package_task中,然后将其放置在一组多对象中,这些对象表示何时运行以及运行什么。

我正在阅读rust文档,它似乎封装了可调用对象和"给我结果"机制。

所以我想我需要一个BTreeSet(我需要按发布时间排序的队列,这样我就可以选择下一个运行(的期货,但我甚至不知道如何声明其中一个。所以,在我深入研究期货的深层次之前,这是正确的方法吗?有没有更好、更自然的铁锈抽象?

对于输出,您可能确实想要一个Future。但是,对于输入,您可能需要一个函数对象(Box<dyn FnOnce(...)>(;看见https://doc.rust-lang.org/book/ch19-05-advanced-functions-and-closures.html.

最新更新