< 返回版块

zaq7434 发表于 2024-07-10 09:53

Tags:同步;定时器

需求: 假设有多个对象集合(Map),或者对象。 需要对每个对象都配置一个定时器,用来定时处理。 为了避免夸线程数据竞争,定时器线程通知主线程进行操作。

目前想到的解决方法: 每个对象加个包裹,Rc<RefCell> , 定时器管理 保存对象的weak引用, 定时器线程通过id通知主线程进行操作。

大家还有好的解决方案吗?

评论区

写评论
lithbitren 2024-07-10 19:18

如果定时任务调度器是跨线程的,只能Arc<Mute>加锁操作了,不过也可以用一些第三方无锁数据结构来跨线程共享数据。

--
👇
zaq7434: 但是除了定时器主线程还有别的流程也会操作这些数据。所以定时器里怎么知道设置定时器的对象是个问题,目前想到的就是使用Rc

--
👇
lithbitren: 应该有现成的定时任务工具或第三方库的,或者看看时间轮算法。如果自己实现的话,一般都是把执行过程序列化或者任务化,序列化更省内存也方便持久化,比如定时删除只记一个del:{key}就可以了,或者用枚举来记录也行,参考tokio的mini-redis教学项目,任务化就推送函数或闭包,更直观方便。然后以执行时间和任务唯一标记为索引(rust里实现cmp),插入到类二叉树或跳表里,每秒钟从头部取掉一批范围节点进行执行就完事了,任务唯一标记也放进索引的作用是方便根据索引修改或取消任务。

作者 zaq7434 2024-07-10 18:58

但是除了定时器主线程还有别的流程也会操作这些数据。所以定时器里怎么知道设置定时器的对象是个问题,目前想到的就是使用Rc

--
👇
lithbitren: 应该有现成的定时任务工具或第三方库的,或者看看时间轮算法。如果自己实现的话,一般都是把执行过程序列化或者任务化,序列化更省内存也方便持久化,比如定时删除只记一个del:{key}就可以了,或者用枚举来记录也行,参考tokio的mini-redis教学项目,任务化就推送函数或闭包,更直观方便。然后以执行时间和任务唯一标记为索引(rust里实现cmp),插入到类二叉树或跳表里,每秒钟从头部取掉一批范围节点进行执行就完事了,任务唯一标记也放进索引的作用是方便根据索引修改或取消任务。

lithbitren 2024-07-10 16:53

应该有现成的定时任务工具或第三方库的,或者看看时间轮算法。如果自己实现的话,一般都是把执行过程序列化或者任务化,序列化更省内存也方便持久化,比如定时删除只记一个del:{key}就可以了,或者用枚举来记录也行,参考tokio的mini-redis教学项目,任务化就推送函数或闭包,更直观方便。然后以执行时间和任务唯一标记为索引(rust里实现cmp),插入到类二叉树或跳表里,每秒钟从头部取掉一批范围节点进行执行就完事了,任务唯一标记也放进索引的作用是方便根据索引修改或取消任务。

1 共 3 条评论, 1 页