为什么 Gradle 任务会阻止执行生成进程的 Python 脚本?
Why does Gradle task block on executing a Python script that spawns a process?
我遇到了一个问题 运行 来自 Gradle 任务的 Python 脚本。
简短版
为什么执行 Python 脚本的 Gradle 任务(其中 Python 脚本生成进程)似乎会阻塞?
长版
背景资料
我创建了三个 Python 脚本。
- start.py:产生两个进程,当脚本退出时它们不会终止
- stop.py: 杀死两个派生进程
- test.py:执行
print("Done")
(此脚本用于调试目的。)
运行 我的 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
突然完成。
我的问题
我需要在不同的任务中使用 start
和 stop
。所以我的问题是:
- 我的 build.gradle 文件中的内容看起来正确吗?
- 为什么 Gradle 在执行生成进程的 Python 脚本时会阻塞?
- 如何在 Python 脚本生成进程后 "unblock"
gradle start
任务?
build.gradle 文件的内容看起来是正确的。所有任务都已正确定义。
因为如果任务是 Exec
类型,它会等到进程完成,然后任务也完成。如果两个单独的进程是从 python 脚本启动的 运行 来自 Exec
任务,并且它们以某种方式 绑定 到启动它们的脚本(这是bounded 到 gradle 任务本身)它都必须完成才能让 gradle 任务也完成。例如,看看 this 问题。
通过编写将在后台启动进程的自定义任务。请参阅上面链接的问题。
希望这对您有所帮助。有什么不明白的,尽管问。
我遇到了一个问题 运行 来自 Gradle 任务的 Python 脚本。
简短版
为什么执行 Python 脚本的 Gradle 任务(其中 Python 脚本生成进程)似乎会阻塞?
长版
背景资料
我创建了三个 Python 脚本。
- start.py:产生两个进程,当脚本退出时它们不会终止
- stop.py: 杀死两个派生进程
- test.py:执行
print("Done")
(此脚本用于调试目的。)
运行 我的 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
突然完成。
我的问题
我需要在不同的任务中使用 start
和 stop
。所以我的问题是:
- 我的 build.gradle 文件中的内容看起来正确吗?
- 为什么 Gradle 在执行生成进程的 Python 脚本时会阻塞?
- 如何在 Python 脚本生成进程后 "unblock"
gradle start
任务?
build.gradle 文件的内容看起来是正确的。所有任务都已正确定义。
因为如果任务是
Exec
类型,它会等到进程完成,然后任务也完成。如果两个单独的进程是从 python 脚本启动的 运行 来自Exec
任务,并且它们以某种方式 绑定 到启动它们的脚本(这是bounded 到 gradle 任务本身)它都必须完成才能让 gradle 任务也完成。例如,看看 this 问题。通过编写将在后台启动进程的自定义任务。请参阅上面链接的问题。
希望这对您有所帮助。有什么不明白的,尽管问。