Saya punya tugas yang memproses daftar file di stdin. Waktu memulai program sangat besar, dan jumlah waktu yang dibutuhkan setiap file sangat bervariasi. Saya ingin menelurkan sejumlah besar proses ini, kemudian mengirim pekerjaan ke mana saja yang tidak sibuk. Ada beberapa alat commandline berbeda yang hampir melakukan apa yang saya inginkan, saya mempersempitnya menjadi dua opsi yang hampir berfungsi:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
Masalahnya adalah split
apakah melakukan round-robin murni, sehingga salah satu proses tertinggal dan tetap di belakang, menunda penyelesaian seluruh operasi; sementara parallel
ingin menelurkan satu proses per N baris atau byte input dan akhirnya saya menghabiskan terlalu banyak waktu untuk overhead startup.
Apakah ada sesuatu seperti ini yang akan menggunakan kembali proses dan memberi makan garis ke proses mana saja yang telah membuka blokir stdins?
myjob
siap untuk menerima lebih banyak input. Tidak ada cara untuk mengetahui bahwa suatu program siap untuk memproses lebih banyak input, yang dapat Anda ketahui adalah bahwa beberapa buffer di suatu tempat (buffer pipa, buffer stdio) siap menerima input lebih banyak. Bisakah Anda mengatur program Anda untuk mengirim beberapa jenis permintaan (mis. Tampilkan konfirmasi) ketika sudah siap?
read
panggilan akan melakukan trik. Itu upaya pemrograman yang cukup besar.
-l 1
di parallel
args? IIRC, yang memberitahukan secara paralel untuk memproses satu baris input per pekerjaan (yaitu satu nama file per garpu myjob, sehingga banyak overhead startup).
split
perintah itu? Nama tersebut bertentangan dengan utilitas pemrosesan teks standar .