Saya memiliki skrip Bash non-sepele yang kira-kira berbentuk berikut:
# Initialization
<generate_data> | while read line; do
# Run tests and filters on line
if [ "$tests_pass" ]; then
echo "$filtered_line"
fi
done | sort <sort_option> | <consume_data>
# Finalization
Dibandingkan dengan filter, generator menggunakan sumber daya pemrosesan yang minimal, dan, tentu saja, operasi pengurutan tidak dapat dimulai sampai semua data yang difilter tersedia. Dengan demikian, filter, rangkaian beberapa loop dan kondisional yang ditulis secara asli di Bash, merupakan hambatan pemrosesan, dan satu proses yang menjalankan loop ini menghabiskan seluruh inti.
Tujuan yang berguna adalah untuk mendistribusikan logika ini ke beberapa proses anak yang masing-masing menjalankan loop filter terpisah, dan yang, pada gilirannya, masing-masing menggunakan blok garis dari generator, dan yang masing-masing menghasilkan blok keluaran yang digabungkan ke dalam operasi pengurutan. Fungsionalitas semacam ini tersedia melalui alat seperti GNU Parallel, tetapi penggunaannya memerlukan pemanggilan perintah eksternal agar dapat dijalankan di dalam pipa.
Apakah ada alat atau fitur praktis yang tersedia yang membuat operasi pada skrip dapat didistribusikan ke berbagai proses tanpa mengganggu keseluruhan struktur skrip? Saya tidak mengetahui fitur bawaan Bash, tapi pasti akan berguna.
parallel
yang tidak diinginkan OP (walaupuninvoking an external command
tidak seburuk menjalankan loop di bash). @epl Dimungkinkan untuk mempercepat filter Anda dengan cukup tanpa harus menggunakan perhitungan paralel. Dengan masukan minimal dan keluaran yang diharapkan, seseorang mungkin memberi Anda solusi di sini. - person Socowi   schedule 02.12.2019such an improvement applied by itself is far inferior to that from utilizing more hardware in parallel
Aku tidak akan mengandalkannya. Perulangan di bash sangat lambat, bahkan secara paralel sering kali tidak dapat berlari lebih cepat dari bahasa lain atau bahkan alat khusus. Contoh: Untuk menghasilkan angka dari 1 hingga 4'000'000, saya membandingkan pendekatan berikut pada inti empat. Satu putaran bash (16.1 detik); empat bash loop secara paralel (5.2s); satu putaran awk (0,9 detik); danseq
(0,1 detik). Perhatikan bahwa loop di sini hanya menggunakan bawaan. Jika Anda berulang kali memanggil program eksternal, keadaannya akan lebih buruk lagi. - person Socowi   schedule 02.12.2019LPUSH
baris/blok ke dalam daftar Redis dan memulai beberapa prosesor yangBRPOP
memblokir daftar danLPUSH
menghasilkan daftar lain. Pekerjaan prosesor dapat dijalankan dalambash
, Python, atau C++ di semua mesin di jaringan Anda. - person Mark Setchell   schedule 05.12.2019&
dan menunggu$!
? Saya biasanya menyimpan setiap hasil dalam array, menunggu semua PID selesai, lalu menjalankan proses sortir/final. Saya akan menulis jawaban dengan contoh singkat hari ini jika Anda mau. - person Matthieu   schedule 07.12.2019