Chạy nhiều ứng dụng song song

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

Leave a Comment

Filed under Software

Leave a Reply