GNU Parallel: ngay lập tức hiển thị stderr / stdout một lần theo thứ tự công việc


8

Tôi biết rằng bộ đệm song song GNU std / stderr vì nó không muốn đầu ra của công việc bị sai lệch, nhưng nếu tôi chạy công việc của mình parallel do_something ::: task_1 task_2 task_3, thì dù sao thì đầu ra của task_1 sẽ được hiển thị ngay lập tức, sau khi task_1 kết thúc, nhiệm vụ của nó sẽ hiện tại đầu ra, vv

Nếu Parallel không thể giải quyết vấn đề này, có chương trình tương tự nào khác có thể không?

Câu trả lời:


12

Từ phiên bản 20160422 bạn có thể làm:

parallel -k --lb do_something ::: task_1 task_2 task_3

Tôi vừa cài đặt nó và nó hoạt động chính xác như tôi muốn. Cảm ơn rât nhiều!
Hải Lương Đông

Cũng có --ungroupnếu bạn không quan tâm đến thứ tự.
zyxue

Từ phiên bản 20170822 --lbkhông chậm hơn nhiều --ungroup.
Ole Tange

2

parallelthực sự không đặt phòng về việc làm cho đầu ra đến theo thứ tự. Nó chỉ xảy ra rằng các công việc thường đủ nhỏ và chia đều trong thời gian cpu để ra theo thứ tự. Bạn nhận thấy nó nhiều hơn khi bạn có rất nhiều công việc đang chạy hoặc thời gian nhiệm vụ của họ khác nhau rất nhiều.

Theo mặc định, parallelsẽ chỉ chạy cùng số lượng công việc như CPU ​​của bạn có lõi. Trên hầu hết các máy tính xách tay và máy tính để bàn có nghĩa là 2-4, điều đó có nghĩa là nó chỉ chạy một vài công việc tại một thời điểm. Bạn có thể tăng nó với -j.

Dưới đây là một ví dụ để chứng minh thứ tự công việc không xuất ra theo thứ tự nó đã được gửi.

seq 20 | parallel -j 20 'sleep $[RANDOM % 20]; echo '

đầu ra trên hệ thống của tôi là (khả năng của bạn sẽ khác)

7
3
13
20
8
16
2
4
18
17
1
5
9
14
12
6
10
19
11
15

seq 20là một lệnh sẽ xuất ra số 1-20. Tôi đặt nó song song và sau đó bảo nó chạy 20 công việc đồng thời để đảm bảo tất cả chúng bắt đầu cùng một lúc. 'sleep $[\[RANDOM][1] % 20];đang sử dụng chế độ ngủ cộng với tham số zsh sẽ trả về một số ngẫu nhiên trong khoảng từ 1 đến 20. Mỗi công việc sẽ ngủ số tiền ngẫu nhiên này và sau đó echo. Một khi tiếng vang công việc, bạn sẽ ngay lập tức nhận được đầu ra từ song song.

Bạn cũng có thể làm một cái gì đó tương tự parallel --shufsẽ xáo trộn trật tự công việc .


1
Trên thực tế, nó có thể với -k/--keep-order(Tôi đã sử dụng parallelphiên bản 20141022)seq 20 | parallel -k -j2000% 'sleep $[RANDOM % 20]; echo ' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Hải Lương Đông
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.