化学变化中形式为yz3和yz5的化合物有那些?

老规矩我们来看主干代码:

如仩,删的有点多大家也可以看一下原函数然后对比一下,看看我为什么只保留这一点

从上面代码中我们可以发现,最重要的是一个子函数调用过程fits, failedPredicates, err := podFitsOnNode()这个函数的参数我没有贴出来,下面会详细讲;

下半部分是一个extender过程extender不影响对predicate过程的理解,我们后面专门当作一个主题講所以这里的关注点是podFitsOnNode()函数。

ParallelizeUntil()函数是用于并行执行N个独立的工作过程!!! 的这个逻辑写的挺有意思,我们看一下完整的代码(这段的汾析思路写到注释里哦):

// 从形参列表看需要关注的有workers和pieces两个数字类型的参数,doworkPiece这个函数类型的参数 // 如果pieces数量比较少也就是说假设node只有10個,那么workers就赋值为10个 // 到这里差不多可以猜到worker是并发工作数当node大于16时并发是16,当node小于16时并发数就是node数 // 从toProcess中拿一个数举个例子,假如现在並发是10那么toProcess里面存的数据其实 // 也是10个,也就是1个goroutine拿到1个数开始了一个下面的default逻辑; // 这时候就是16个“消费者”在消耗100个数。当然每拿到┅个数需要执行到一次下面的default // 对应调用过程也就是checkNode函数传入了一个整型参数piece

checkNode的主要逻辑就是上面介绍的并发加上下面这个podFitsOnNode()函数逻辑:

关于這个函数的逻辑注释里的描述翻译过来大概是这个意思:

  1. 当从Schedule进入时:这个函数想要测试node上所有已经存在的pod外加被指定将要调度到这个node仩的其他所有高优先级(优先级不比自己低,也就是>=)的pod后当前pod是否可以被调度到这个node上。
  2. 当从Preempt进入时:后面讲preempt时再详细分析

podFitsOnNode()函数的參数有点多,每个跟进去就是一堆知识点这里建议大家从字面先过一边,然后跟进去看一下类型定义类型的注释等,了解一下功能先不深究。整体看完一边调度器代码后回过头深入细节

FitPredicate是一个函数类型,3个参数pod和node都很好理解,meta跟进去简单看一下可以发现定义的是┅些和predicate相关的一些元数据这些数据是根据pod和node信息获取到的,类似pod的端口有哪些pod亲和的pod列表等。返回值是一个表示是否fit的bool值predicate失败的原洇列表,一个错误类型

// 这里省略一个for循环,下面会单独讲

这里的逻辑是从一个for循环开始的关于这个2次循环的含义代码里有很长的一段紸释,我们先看一下注释里怎么说的(这里可以多看几遍体会一下):

  • 出于某些原因考虑我们需要运行两次predicate. 如果node上有更高或者相同优先级嘚“指定pods”(这里的“指定pods”指的是通过schedule计算后指定要跑在一个node上但是还未真正运行到那个node上的pods)我们将这些pods加入到meta和nodeInfo后执行一次计算過程。
  • 如果这个过程所有的predicates都成功了我们再假设这些“指定pods”不会跑到node上再运行一次。第二次计算是必须的因为有一些predicates比如pod亲和性,吔许在“指定pods”没有成功跑到node的情况下会不满足
  • 如果没有“指定pods”或者第一次计算过程失败了,那么第二次计算不会进行
  • 我们在第一佽调度的时候只考虑相等或者更高优先级的pods,因为这些pod是当前pod必须“臣服”的也就是说不能够从这些pod中抢到资源,这些pod不会被当前pod“抢占”;这样当前pod也就能够安心从低优先级的pod手里抢资源了
  • 新pod在上述2种情况下都可调度基于一个保守的假设:资源和pod反亲和性等的predicate在“指萣pods”被处理为Running时更容易失败;pod亲和性在“指定pods”被处理为Not Running时更加容易失败。
  • 我们不能假设“指定pods”是Running的因为它们当前还没有运行而且事實上,它们确实有可能最终又被调度到其他node上了

看了这个注释后,上面代码里的前几行就很好理解了在第一次进入循环体和第二次进叺时做了不同的处理,具体怎么做的处理我们暂时不关注下面看省略的这个for循环做了啥:

// 降低难度,先不看缓存情况 // 真正调用predicate函数了!!!!!!!!!

如上,我们看一下2个地方:

如上这里定义了一个次序,前面的for循环遍历的是这个[]string这样也就实现了不管predicateFuncs里定义了怎樣的顺序,影响不了predicate的实际调用顺序官网对于这个顺序有这样一个解释:

这个表格大家对着字面意思体会一下吧,基本还是可以联想到意义的

当然这个顺序是可以被配置文件覆盖的,用户可以使用类似这样的配置:

整体过完源码后我们再实际尝试一下这些特性这一边先知道有这回事吧,ok继续~

这行代码其实没有啥复杂逻辑,不过我们还是重复讲一下清晰理解这一行很有必要。这里的predicate()来自前几行的if語句predicate, exist :=

这个文件中predicate函数有点多这样看眼花,我们具体点开一个观察一下:

这个函数的实现也特别简单遍历pod的Volumes,然后对于pod的每一个Volume遍历node仩的每个pod,看是否和当前podVolume冲突如果不fit就返回false加原因;如果fit就返回true,很清晰

}

我要回帖

更多关于 化学变化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信