Bagaimana saya bisa mendapatkan indeks "prosesor paralel" xargs?

14

Misalkan saya memiliki dua sumber daya, bernama 0dan 1, yang hanya dapat diakses secara eksklusif.

Apakah ada cara untuk memulihkan "indeks" dari "prosesor paralel" yang xargsdiluncurkan untuk menggunakannya sebagai layanan saling pengecualian gratis? Misalnya, pertimbangkan perhitungan paralel berikut:

$ 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

Pertanyaan saya adalah apakah ada kata ajaib, katakanlah index, di mana output akan terlihat

$ 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

di mana satu-satunya jaminan adalah bahwa hanya ada paling tidak satu proses menggunakan sumber daya 0dan sama untuk 1. Pada dasarnya, saya ingin mengomunikasikan indeks ini ke proses anak yang akan menghormati aturan untuk hanya menggunakan sumber daya yang diperintahkan.

Tentu saja, akan lebih baik untuk memperluas ini ke lebih dari dua sumber daya. Memeriksa dokumen, xargsmungkin tidak bisa melakukan ini. Apakah ada solusi setara minimal? Menggunakan / membersihkan file sebagai kunci palsu tidak disukai.

VF1
sumber

Jawaban:

18

Jika Anda menggunakan GNU xargs , ada --process-slot-var:

--process-slot-var= environment-variable-name
Setel variabel lingkungan environment-variabel-nama ke nilai unik di setiap proses anak yang berjalan. Setiap nilai adalah bilangan bulat desimal. Nilai digunakan kembali setelah proses anak keluar. Ini dapat digunakan dalam skema distribusi beban yang belum sempurna, misalnya.

Jadi, misalnya:

~ 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
muru
sumber