我正在尝试创建一个脚本,在后台启动一堆作业,然后等待所有作业运行完成。
#!/bin/sh
cleanup() {
wait
echo cleanup
}
do_work() {
sleep 2
echo done "$@"
}
run() {
trap cleanup EXIT
do_work 1 &
# ... some code that may fail ...
do_work 2 &
# I can't just call cleanup() here because of possible early exit
}
# The script itself runs in the background too.
run&
Run Code Online (Sandbox Code Playgroud)
为了确保该脚本将等待其所有子进程,即使在生成子进程时出现问题,我也会使用而trap cleanup EXIT不是仅cleanup在最后使用。
但是当我在不同的 shell 中运行此脚本时,我得到以下结果:
$ for sh in zsh dash 'busybox ash' bash; do echo "$sh:"; …Run Code Online (Sandbox Code Playgroud) 今天,我的一个朋友告诉我,Go程序可以在多个CPU内核上进行扩展。听到系统任务调度程序对goroutine一无所知,因此无法在多个内核上运行它们,我感到非常惊讶。
我进行了一些搜索,发现Go程序可以产生多个OS任务以在不同的内核上运行它们(该数目由GOMAXPROCS环境变量控制)。但是据我所知,对流程进行分叉可导致流程数据的完整复制,并且不同的流程在不同的地址空间中运行。
那么Go程序中的全局变量呢?它们可以安全地与多个goroutine一起使用吗?它们是否以某种方式在系统进程之间同步?如果他们这样做,那又如何?我主要关注linux和freebsd的实现。