Xargs

如何獲取 xargs“並行處理器”的索引?

  • June 12, 2018

假設我有兩個資源,名為01,只能以獨占方式訪問。

有沒有辦法恢復xargs啟動的“並行處理器”的“索引”,以便將其用作免費互斥服務?例如,考慮以下並行計算:

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {}"
consuming task 1
consuming task 2
consuming task 3
consuming task 4
consuming task 5
consuming task 6
consuming task 7
consuming task 8

我的問題是是否存在一個神奇的詞,比如說index,輸出看起來像

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {} with resource index"
consuming task 1 with resource 0
consuming task 2 with resource 1
consuming task 3 with resource 1
consuming task 4 with resource 1
consuming task 5 with resource 0
consuming task 6 with resource 1
consuming task 7 with resource 0
consuming task 8 with resource 0

唯一的保證是,最多只有一個程序使用資源0,並且對於1. 基本上,我想將此索引傳達給子程序,該子程序會遵守規則,只使用它被告知的資源。

當然,最好將其擴展到兩個以上的資源。檢查文件,xargs可能無法做到這一點。有最小的等效解決方案嗎?使用/清理文件作為假鎖是不可取的。

如果您使用的是GNU xargs,則有--process-slot-var

--process-slot-var= environment-variable-name

將環境變數environment-variable- name 設置為每個正在執行的子程序中的唯一值。每個值都是一個十進制整數。一旦子程序退出,值就會被重用。例如,這可以用於基本的負載分配方案。

因此,例如:

~ echo {1..9} | xargs -n2 -P2 --process-slot-var=index sh -c 'echo "$index" "$@" "$$"' _
0 1 2 10475
1 3 4 10476
1 5 6 10477
0 7 8 10478
1 9 10479

引用自:https://unix.stackexchange.com/questions/449224