2011-07-05 36 views
7

Tôi có một tập lệnh - một danh sách các lệnh tuyến tính - mất nhiều thời gian để chạy tuần tự. Tôi muốn tạo ra một kịch bản tiện ích (Perl, Bash hoặc khác có sẵn trên Cygwin) có thể đọc các lệnh từ bất kỳ kịch bản tuyến tính nào và đưa chúng vào một số lượng nhân viên song song có thể cấu hình được.Perl hoặc Bash threadpool script?

Vì vậy, nếu myscript

command1 
command2 
command3 

tôi có thể chạy:

threadpool -n 2 myscript 

Hai chủ đề sẽ được tạo ra, một bắt đầu với command1command2 khác. Cho dù chủ đề nào kết thúc công việc đầu tiên của nó trước tiên thì sẽ chạy command3.

Trước khi đi sâu vào Perl (đã lâu rồi) Tôi nghĩ rằng tôi nên hỏi các chuyên gia nếu một thứ như thế này đã tồn tại. Tôi chắc rằng cần phải có một cái gì đó như thế này bởi vì nó sẽ vô cùng hữu ích cho cả việc khai thác các máy đa CPU và cho việc truyền mạng song song (wget hoặc scp). Tôi đoán tôi không biết cụm từ tìm kiếm phù hợp. Cảm ơn!

+0

Làm thế nào về điều này? http://www.rootninja.com/use-multiple-processors-in-bash-by-running-commands-in-parallel/ – carlpett

+0

@carlpett Có - bạn có câu trả lời trong đó - 'xargs -P' Cảm ơn bạn. – paperjam

+0

Có liên quan cao: http://stackoverflow.com/questions/4539310/does-a-modified-command-invocation-toolwhich-dynamically-regulates-a-job-pool (xargs không hoạt động tốt với nhiều công cụ, ví dụ: giải nén) – daxim

Trả lời

3

Trong Perl bạn có thể làm điều này với Parallel::ForkManager:

#!/usr/bin/perl 

use strict; 
use warnings; 
use Parallel::ForkManager; 
my $pm = Parallel::ForkManager->new(8); # number of jobs to run in parallel 

open FILE, "<commands.txt" or die $!; 
while (my $cmd = <FILE>) { 
    $pm->start and next; 
    system($cmd); 
    $pm->finish; 
} 
close FILE or die $!; 

$pm->wait_all_children; 
+0

Phiên bản của Perl được yêu cầu? – sehe

0

Bạn cũng có thể sử dụng make. Here là một bài viết rất thú vị về cách sử dụng nó một cách sáng tạo

+0

Trong trường hợp đó, scons sẽ là một cách tiếp cận linh hoạt hơn (và ít phức tạp hơn) – sehe

+1

Liên kết bị hỏng, nhưng vẫn có sẵn thông qua máy rút tiền: http: //web.archive.org/web/20120509141639/http: // teddziuba.com/2011/02/stupid-unix-tricks-workflow-control-with-gnu-make.html – Quantum7

4

Nếu bạn cần đầu ra không bị lẫn lộn (mà xargs -P rủi ro làm), sau đó bạn có thể sử dụng GNU Parallel:

parallel -j2 ::: command1 command2 command3 

Hoặc nếu các lệnh nằm trong một tệp:

cat file | parallel -j2 

GNU Song song là một bộ song song chung và dễ dàng thực hiện công việc song song trên cùng một máy hoặc trên nhiều máy bạn có quyền truy cập ssh.

Nếu bạn có 32 công việc khác nhau mà bạn muốn chạy trên 4 CPU, một cách thẳng về phía trước để parallelize là chạy 8 việc làm trên mỗi CPU:

Simple scheduling

GNU Parallel thay spawns một quá trình mới khi một kết thúc - giữ CPU hoạt động và do đó tiết kiệm thời gian:

GNU Parallel scheduling

Lắp đặt

Nếu GNU Parallel không được đóng gói cho bản phân phối của bạn, bạn có thể thực hiện cài đặt cá nhân, không yêu cầu quyền truy cập gốc.Nó có thể được thực hiện trong 10 giây bằng cách làm này:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Đối với tùy chọn cài đặt khác nhìn thấy http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Tìm hiểu thêm

Xem thêm ví dụ: http://www.gnu.org/software/parallel/man.html

Xem video giới thiệu: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Đi qua t anh hướng dẫn: http://www.gnu.org/software/parallel/parallel_tutorial.html

Đăng ký cho danh sách email để nhận được hỗ trợ: https://lists.gnu.org/mailman/listinfo/parallel

Các vấn đề liên quan