不应该使用注册列表中的task作为运行列表的task
yuenjee opened this issue · 2 comments
yuenjee commented
问题描述:
当前实现机制,有一个新的任务请求过来,根据ExecutorHandler从注册列表获取task的指针,然后填充task的运行时参数,接着把task放入运行列表,并其一个协程运行task。存在的问题是,如果有两个或者多个相同的task,它们都是相同的ExecutorHandler(可以理解为task类型),在运行列表存的都是同一个task对象,那么task记录的是最后一个请求的参数。这样导致多任务运行结果错误。比如先运行同ExecutorHandler的A任务,然后运行同ExecutorHandler的B任务,现在要取消A任务,结果把B任务结束了。
解决办法:
从注册task中获取task后,复制一份task,作为运行的task对象。
yuenjee commented
建议代码修改如下:
cxt := context.Background()
task := &(*(e.regList.Get(param.ExecutorHandler)))
if param.ExecutorTimeout > 0 {
rushuinet commented
覆盖之前调度 会取消之前的任务,单机串行,丢弃后续调度 都进行阻塞,任务不会调度成功,也就是说,同一个任务在一个节点上永远都是串行的,后面考虑ExecutorHandler和ExecutorParams做任务唯一标识,这样同一ExecutorHandler可以根据不同参数做成多个任务,目前看是非必要的。。可以征求大家的意见