Kể từ RPi v2, CPU có 4 nhân. Vì vậy nên tận dụng khả năng của RPi để chạy nhiều chương trình song song, mỗi chương trình chạy trên một nhân khác nhau. Chạy song song khác với chạy đa luồng, các luồng chạy đồng thời có thể chia sẽ dữ liệu nhưng có thể tất cả đều chạy trên cùng một nhân. Cho dù chạy song song hay đa luồng, hiệu quả được nâng cao rất rõ.
GNU Parallel
Chạy câu lệnh sau đây để cài đặt
sudo apt-get install parallel
Xem hướng dẫn sử dụng parallel
man parallel_tutorial
Thí dụ, chạy đồng thời các lệnh echo với dữ liệu đầu vào là A, B và C
parallel echo ::: A B C
Các ký tự A, B và C in ra màn hình có thể không theo thứ tự đầu vào do các lệnh echo chạy song song độc lập.
Dữ liệu đầu vào cũng có thể lấy từ file
cat abc-file | parallel echo parallel -a abc-file echo
Nếu không có lệnh nào đi sau parallel thì mỗi tham đối đầu vào đều xem như lệnh
parallel ::: ls 'echo foo' pwd
Output (thứ tự có thể khác):
[danh sách file trong thư mục hiện tại, kết quả của lệnh ls]
foo #kết quả của lệnh echo foo
[đường dẫn của thư mục hiện hành, kết quả của lệnh pwd]
Lệnh có thể là script, nhị phân hay hàm Bash nếu hàm đã export bằng cách dùng export -f
# Only works in Bash my_func() { echo "in my_func $1" } export -f my_func parallel my_func ::: 1 2 3
Output (thứ tự có thể khác):
in my_func 1
in my_func 2
in my_func 3
- Chú ý, nếu crontab gọi câu lệnh parallel hay script có câu lệnh parallel với lệnh là tên hàm Bash thì kết quả sẽ không như mong muốn, vì mặc định crontab thực thi câu lệnh bằng sh. Khi đó thêm vào bảng crontab một dòng ở trên cùng
SHELL=/bin/bash
để crontab thực thi câu lệnh bằng bash
- Khi một hàm Bash được export nhưng chưa được gọi chạy, tất cả biến đều chưa được khởi tạo và không thể tham chiếu đến biến được khai báo bên ngoài phạm vi hàm.
Parallel còn thay thế câu lệnh while hay for
export -f func { find "$foo" -maxdepth 2 -mindepth 2 -type f ; find "$bar" -maxdepth 2 -mindepth 2 -type f ; } | parallel -j4 func
hay
export -f func
notifywait -mrq -e CLOSE_WRITE --format %w%f $foo/{"$bar1","$bar2"} | parallel -j4 func