Rust 如何在基板上实现背景线程?

Rust 如何在基板上实现背景线程?,rust,blockchain,substrate,polkadot,Rust,Blockchain,Substrate,Polkadot,让我们想象一下,我想设计一个类似于众筹或拍卖的系统。此类事件的运行有固定的时间段。我是否可以启动一个后台线程,定期检查事件是否已到达结束时间,然后关闭该事件?我正在查看未来板条箱(和其他一些),但它在基板内可用吗?关于如何处理这种情况,有什么最佳做法吗?我相信期货的答案是否定的。这里有更多的解释: 我认为最好考虑底层运行时中可用的编程原语,而不是尝试使用通用编程(未来)中的概念,并尝试将其重新用于底层运行时(自上而下与自下而上的观点) 因此,让我们考虑一下运行时的生命周期,看看有什么意义: 在运

让我们想象一下,我想设计一个类似于众筹或拍卖的系统。此类事件的运行有固定的时间段。我是否可以启动一个后台线程,定期检查事件是否已到达结束时间,然后关闭该事件?我正在查看
未来
板条箱(和其他一些),但它在基板内可用吗?关于如何处理这种情况,有什么最佳做法吗?

我相信
期货的答案是否定的。这里有更多的解释:

我认为最好考虑底层运行时中可用的编程原语,而不是尝试使用通用编程(
未来
)中的概念,并尝试将其重新用于底层运行时(自上而下与自下而上的观点)

因此,让我们考虑一下运行时的生命周期,看看有什么意义:

在运行时内,您会被困在一个盒子里。(wasm)运行时代码由(始终是本机的)客户机生成并执行,只要有一个新的块要导入(或编写,但我们假设现在只是导入),然后被杀死并在之后被搁置(至少从运行时的角度来看——客户机有运行时缓存)。我的观点是,在每个块的执行结束时,没有提交到状态(即在存储器中写入)的任何内容都将丢失。这包括所有局部变量、堆栈、堆和其他任何内容。因此,即使您要使用未来来生成任务,这也不符合底层运行时的编程模型,因为即使未来存在于运行时中,一旦块完成,wasm实例就死了,未来也是如此

这完全忽略了一个事实,即您只能在运行时使用支持
no_std
的板条箱,因此并非所有异步库都可用


正如我所暗示的,主要的解决方案可能是使用状态存储来记录拍卖的开始点,这样x块之后您仍然可以知道何时开始拍卖,如果超过某个阈值,那么您就可以完成拍卖。您可以在拍卖期间使用时间戳或多个区块。大致如下:


特征配置:frame_system::Config{
//持续时间或区块编号
类型拍卖持续时间;
}
//在您的on_内初始化
fn on_初始化(n:T::BlockNumber){
如果n%T::AuctionDuration::get()==0{
//^^^注意:请确保该值为非零,否则运行时可能会出现死机。
//是时候结束拍卖了。
}
}

完美答案,非常感谢!我只想加上官方文件,让它清楚