为什么 Gradle 任务会阻止执行生成进程的 Python 脚本?

Why does Gradle task block on executing a Python script that spawns a process?

我遇到了一个问题 运行 来自 Gradle 任务的 Python 脚本。

简短版

为什么执行 Python 脚本的 Gradle 任务(其中 Python 脚本生成进程)似乎会阻塞?

长版

背景资料

我创建了三个 Python 脚本。

运行 我的 terminal/console 本地的所有三个 Python 脚本执行预期的行为。

我有一个 Gradle 任务,用于每个 Python 脚本,其中任务调用 Python 脚本。我的 build.gradle 看起来像这样:

task start (type:Exec) {
    workingDir './mysie'
    commandLine 'python', 'start.py'
}

task stop(type:Exec) {
    workingDir './mydir'
    commandLine 'python', 'stop.py'
}

task testPython(type:Exec) {
    workingDir './mydir'
    commandLine 'python', 'test.py'
}

我要解决的问题

我正在使用 Gradle 包装器可执行文件,如果我执行 gradlew testPython,任务会运行并且我会收到 BUILD SUCCESSFUL 消息。

$ /gradlew test
Parallel execution is an incubating feature.
:testPython
Done

BUILD SUCCESSFUL

Total time: 0.888 secs

所以这表明gradlew可以成功执行一个Python脚本而不阻塞。但是,当我执行 gradlew start 时,会产生两个进程。重要的是不要让 Python 脚本生成两个进程,但不会终止它们。 Gradle 任务永远不会完成。它似乎被阻止了。这是我看到的输出:

$ gradlew start
Parallel execution is an incubating feature.
:start
<Insert Python "print" statement that have been flushed here>
> Building 0% > :start

我可以看到在我的主机上启动的进程。此外,在 start.py 存在之前,我 print("Exiting...") 显示在控制台上。所以我知道 Python 脚本已执行并完成。

在另一个终端中,我执行 gradle stop,它成功终止了进程。

这是奇怪的部分。 gradle stop 命令成功完成后,先前被阻止的 gradle start 突然完成。

我的问题

我需要在不同的任务中使用 startstop。所以我的问题是:

  1. 我的 build.gradle 文件中的内容看起来正确吗?
  2. 为什么 Gradle 在执行生成进程的 Python 脚本时会阻塞?
  3. 如何在 Python 脚本生成进程后 "unblock" gradle start 任务?
  1. build.gradle 文件的内容看起来是正确的。所有任务都已正确定义。

  2. 因为如果任务是 Exec 类型,它会等到进程完成,然后任务也完成。如果两个单独的进程是从 python 脚本启动的 运行 来自 Exec 任务,并且它们以某种方式 绑定 到启动它们的脚本(这是bounded 到 gradle 任务本身)它都必须完成才能让 gradle 任务也完成。例如,看看 this 问题。

  3. 通过编写将在后台启动进程的自定义任务。请参阅上面链接的问题。

希望这对您有所帮助。有什么不明白的,尽管问。