Bash: Nhiều vòng lặp trong Nền


8

Đây có phải là cách chính xác để bắt đầu nhiều quá trình tuần tự trong nền?

for i in {1..10}; do
    for j in {1..10}; do
        run_command $i $j;
    done &
done;

Tất cả jnên được xử lý sau một thời gian nhất định i, nhưng tất cả inên được xử lý đồng thời.


Bạn có ý nghĩa gì bởi "cách chính xác"?
Eran Ben-Natan

Chủ yếu là nó hoạt động. Tôi đã bỏ lỡ điều này trên stackoverflow.
Đài phát thanh được điều khiển

1
:-) Tôi đang hỏi vì mã của bạn hoạt động tốt với tôi. Nếu theo "cách chính xác", bạn có nghĩa là thực hành tốt nhất, thì tôi sẽ đặt vòng lặp bên trong vào một hàm hoặc thậm chí các tệp khác để nó rõ ràng hơn
Eran Ben-Natan

Câu trả lời:


8

Vòng lặp bên ngoài mà bạn có về cơ bản là

for i in {1..10}; do
    some_compound_command &
done

Điều này sẽ bắt đầu mười trường hợp đồng thời some_compound_commandtrong nền. Chúng sẽ được bắt đầu nhanh nhất có thể, nhưng không hoàn toàn "tất cả cùng một lúc" (nghĩa là nếu some_compound_commandmất rất ít thời gian, thì lần đầu tiên có thể kết thúc tốt trước khi lần cuối cùng bắt đầu).

Thực tế some_compound_commandlà một vòng lặp không quan trọng. Điều này có nghĩa là mã mà bạn hiển thị là chính xác trong các lần lặp của jvòng trong sẽ được chạy tuần tự, nhưng tất cả các phiên bản của vòng lặp bên trong (một lần lặp của ivòng ngoài ) sẽ được bắt đầu đồng thời.

Điều duy nhất cần ghi nhớ là mỗi công việc nền sẽ được chạy trong một lớp con. Điều này có nghĩa là những thay đổi được thực hiện cho môi trường (ví dụ: sửa đổi giá trị của các biến shell, thay đổi của thư mục làm việc hiện tại cd, v.v.) trong một phiên bản của vòng lặp bên trong sẽ không hiển thị bên ngoài công việc nền cụ thể đó.

Những gì bạn có thể muốn thêm là một waittuyên bố sau vòng lặp của bạn, chỉ để chờ cho tất cả các công việc nền thực sự kết thúc, ít nhất là trước khi tập lệnh kết thúc:

for i in {1..10}; do
    for j in {1..10}; do
        run_command "$i" "$j"
    done &
done

wait

3

Nếu bạn có GNU Parallel, bạn sẽ làm:

parallel -j0 'for j in {1..10}; do run_command {} $j; done' ::: {1..10}

Một trong những lợi ích là đầu ra từ chạy song song run_commandssẽ không trộn lẫn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.