2011-11-25 34 views
5

Tôi có một bộ nhiệm vụ được đặt hàng một phần, trong đó đối với mỗi tác vụ, tất cả các nhiệm vụ được thực hiện nghiêm ngặt trước khi nó theo thứ tự một phần phải được thực hiện trước khi nó có thể được thực thi. Tôi muốn thực thi các tác vụ không liên quan (hoặc trước hoặc sau một) đồng thời cố gắng giảm thiểu tổng thời gian thực hiện - nhưng không bắt đầu một nhiệm vụ trước khi các phụ thuộc của nó được hoàn thành.Làm cách nào để xử lý một phần đơn hàng nhiệm vụ đồng thời sử dụng Perl?

Các tác vụ sẽ chạy dưới dạng quy trình con (không phải là perl).

Tôi nên tiếp cận cách giải quyết vấn đề như thế này bằng Perl như thế nào? Các cơ sở dữ liệu và cơ sở dữ liệu kiểm soát đồng thời nào có sẵn?

+0

Một gian lận: bạn cũng có thể viết Makefile để mô tả các phụ thuộc và làm ví dụ: 'make -j 4' cho tối đa 4 công nhân đồng thời. – Dallaylaen

Trả lời

1

Tôi sẽ sử dụng hàm băm của mảng. Đối với mỗi công việc, tất cả prerequisities của nó sẽ được đề cập trong mảng tương ứng:

$prereq{task1} = [qw/task2 task3 task4/]; 

Tôi sẽ giữ nhiệm vụ hoàn thành trong một hash khác nhau, và sau đó chỉ cần

my @prereq = @{ $prereq{$task} }; 
if (@prereq == grep exists $completed{$_}, @prereq) { 
    run($task); 
} 
1

Trông giống như một giải pháp đầy đủ là NP-complete. Đối với một giải pháp từng phần, tôi sẽ sử dụng một số dạng tính tham chiếu để xác định công việc nào đã sẵn sàng để chạy, Forks::Super::Job để chạy công việc nền và kiểm tra trạng thái của chúng và POSIX::pause để ngủ khi số lượng công việc tối đa được sinh ra.

Không có chủ đề nào có liên quan vì bạn đã xử lý các quy trình riêng biệt.

Đọc liên kết đầu tiên cho các thuật toán/chẩn đoán có thể có để xác định các ưu tiên của công việc có thể chạy được.