当前位置: 首页 > 面试题库 >

Currying groovy CPS封闭以并行执行

顾兴昌
2023-03-14
问题内容

我们在某些工作中动态创建并行步骤。感谢这个线程,我找到了如何动态创建带有并行步骤中使用的参数的地图。

但是,现在我想重用用于创建这些并行步骤的部分代码。为此,我觉得我需要关闭这些内容。

但是,currying似乎无法正常工作。引用闭包内部的循环变量(valueCopy)做正确的事,但是currying并没有达到我的期望。

我做错什么了吗?是否还不支持?有没有解决方法?这可能是詹金斯管道中的错误吗?

希望任何人都有线索,为什么这不起作用和/或如何使其起作用。

Jenkins:截至2017/01/19的LTS(2.32.1)和最新的插件更新。

解:

升级到Pipeline之后:Groovy插件版本2.40 eveything现在可以按预期工作。

执行管道脚本:

def echoSome(val) {
    echo val
}

def buildClosures() {
    def someList = ["1", "2", "3"]
    def closures = [:]
    for (value in someList) {
        final valueCopy = value

        closures[value] = {val ->
                echo valueCopy.toString()
                echo val.toString()
            }.curry(value)
    }
    closures
}

parallel buildClosures()

输出:

[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] echo
[1] 3
[Pipeline] [1] }
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] echo
[2] 3
[Pipeline] [2] }
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] }
[Pipeline] // parallel
[Pipeline] End of Pipeline
Finished: SUCCESS

预期产量:

[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] }
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] }
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] }
[Pipeline] // parallel
[Pipeline] End of Pipeline
Finished: SUCCESS

问题答案:

发现使用最新的Pipeline:Groovy插件(2.40)至少与Jenkins版本2.60.3结合使用(尽管插件主页指出您至少需要Jenkins 2.73.3才有效),所有功能均按预期工作。



 类似资料:
  • 在Java8中,可以设置一个定制的forkJoinPool供并行流使用,而不是公共池。 我的问题是它在技术上是如何发生的? 流以任何方式都不知道它被提交给了自定义的forkJoinpool并且没有直接访问它的权限。那么最终如何使用正确的线程来处理流的任务呢? 我试着看源代码,但没有用。我的最佳猜测是在提交时的某个点设置了某个threadLocal变量,然后在稍后由流使用。如果是这样的话,为什么语言

  • 1.3 新版功能. 默认情况下,Fabric 会默认 顺序 执行所有任务(详细信息参见 Execution strategy ),这篇文档将介绍 Fabric 如何在多个主机上 并行 执行任务,包括 Fabric 参数设置、任务独立的装饰器,以及命令行全局控制。 它是如何运转的 由于 Fabric 1.x 并不是完全线程安全(以及为了更加通用,任务函数之间并不会产生交互),该功能的实现是基于 Py

  • 问题内容: 我的用例是在pdf页面上有一个类似的按钮(确实是将它们添加到现有页面上,但是现在我只想看到它可以在任何东西上工作)。 它所做的只是关闭当前的pdf页面。想法是打开多个选项卡,每个选项卡都是一个pdf,然后当您单击“后退”按钮时,它将关闭当前pdf,然后将其聚焦到上一个pdf。到目前为止,这是我一直在尝试使用的。 而且我似乎看不到pdf页面上的任何内容(它全是白色),我确实获得了至少至少

  • 我有4个@Test方法,希望每个方法都运行3次。我想在12个线程中同时执行所有这些。 我创建了一个testng。像这样的xml文件 如果我设置并行="方法",TestNG在Test1的4个线程中执行4个测试方法,之后对Test2执行相同的操作,然后对Test3执行相同的操作。但是我不想在运行Test2之前等待Test1完成。TestNG能够运行Test1、Test2 有没有办法告诉TestNG不要

  • 我有一个包含REST服务的Java Spring Boot后端应用程序。就在Spring Boot project的主文件夹中,我有一个React应用程序用于前端。我可以运行Spring Boot应用程序并成功访问所有endpoint。我可以运行React应用程序,它也能工作。但现在我想创建一个可执行的jar文件,并将其作为一个应用程序运行,而不是两个应用程序。 我创建了一个可执行的fat jar

  • 以我的经验,一提到并发执行,90%的人都会提到线程,的确这玩意用的很广泛,综合来说各方面都还可以。虽然很多语言都内置了线程库,C++11也有了,但严格来说线程是跟操作系统相关,具体说,如果操作系统支持线程,则语言的线程库简单封装下就可以了,如果操作系统不支持(如一些unix系统),那就比较麻烦了,简单的可以去掉线程库,或接口返回异常,复杂的可能自己实现一个用户态的线程机制 一个语言实现中如果要用到