Làm thế nào để thiết kế tốt nhất một hàng đợi công việc với các ràng buộc?


9

Hãy xem xét tình huống sau:

  • Bạn có một chương trình tạo ra nhiều 'công việc' cần được xử lý và xếp chúng vào hàng đợi.
  • Bạn có các chương trình công nhân khác sắp xếp 'công việc' tiếp theo để họ có thể xử lý công việc đó.
  • Mỗi công việc có một loại.
  • Có thể có bất kỳ số lượng các loại.
  • Hai công việc có cùng loại không thể được xử lý cùng một lúc bởi các công nhân riêng biệt.
  • Một công nhân có thể xử lý một công việc tại một thời điểm.

Một hàng đợi truyền thống sẽ không hoạt động trong tình huống này bởi vì có khả năng nhiều công việc cùng loại sẽ được xử lý đồng thời, điều này không được phép.

Bạn có thể yêu cầu nhân viên kiểm tra công việc mà họ nắm bắt và xem liệu danh mục công việc đó có một công nhân khác hiện đang xử lý công việc đó không và nếu có thì hãy gửi lại công việc vào hàng đợi để xử lý sau. Đây có vẻ là một cách không hiệu quả để giải quyết vấn đề này. Có bất kỳ cấu trúc dữ liệu hoặc các mẫu thiết kế có thể giải quyết vấn đề này?

Nếu bạn cần làm rõ thêm, xin vui lòng cho tôi biết.


Lý do đằng sau các hạn chế theo chủ đề là gì? Có lẽ bạn có thể thay đổi điều đó.
Andy

@Andy Tôi sẽ trả lời bạn ở đây vì tôi không chắc cách tích hợp nó vào câu hỏi. Nó thực sự chỉ là một hạn chế phần cứng. Mỗi danh mục có một tài nguyên phần cứng cụ thể mà nó phải tương tác (kết nối trên cùng một cổng), do đó hai công việc không thể tương tác với cùng một thiết bị cùng một lúc.
merp

@merp Bạn có tìm thấy gì không? Tôi đang tìm kiếm một cái gì đó rất giống nhau, tôi cần các công việc để khai báo các khóa và / hoặc semaphores chia sẻ. Trường hợp của bạn là tương tự ngoại trừ bạn chỉ cần khóa độc quyền.
Guillaume86

Câu trả lời:


3

Có hai phần của vấn đề này.

Một: danh sách chưa biết của các loại có thể.

Hai: giao tiếp giữa các công nhân để ngăn chặn hai công việc cùng loại được xử lý đồng thời.

Nếu bạn có một danh sách các danh mục đã biết, bạn có thể có một hàng đợi và một nhân viên cho mỗi danh mục.

Với các danh mục không xác định, bạn vẫn có thể có một hàng đợi cho mỗi danh mục, nhưng có một nhân viên xếp hàng cho mỗi danh mục yêu cầu bạn giám sát tất cả các hàng đợi và sa thải nhân viên mới khi một danh mục mới xuất hiện.

Điều này có thể đạt được với một nhân viên 'chính chủ' đang giao việc

Tất cả các công việc đi trong hàng đợi 'chủ'.

nhân viên thể loại tạo ra một hàng đợi riêng và đăng ký với chủ như có sẵn cho công việc.

công nhân bậc thầy chọn công việc, kiểm tra danh mục, kiểm tra công nhân có sẵn và giao công việc cho một trong số họ bằng cách đưa nó vào hàng đợi riêng.

Bậc thầy có thể theo dõi danh mục được giao cho công nhân.

Bậc thầy chọn công việc tiếp theo, cùng loại và công nhân vẫn đang bận nên nó đặt các công việc trong một hàng đợi cụ thể của danh mục

Master nhận được công việc tiếp theo, nó là một thể loại mới vì vậy nó giao nó cho một nhân viên thể loại khác.

Nhân viên hạng mục hoàn thành công việc và reregisters cho công việc

kiểm tra chính giữ hàng đợi và hàng đợi công việc tiếp theo và giao cho công nhân loại có sẵn.

Nếu một nhân viên thể loại gặp sự cố trong một công việc, nó sẽ không đăng ký lại. Vì vậy, chủ có thể có một số logic thời gian chờ, nơi nó sẽ từ bỏ và bắt đầu gán các danh mục cho một nhân viên khác.

Bạn cũng phải cẩn thận khi chỉ có một nhân viên chính duy nhất tại bất kỳ thời điểm nào. Điều này không có khóa độc quyền trên hàng đợi chính của một số loại


2

Nhược điểm của đề xuất không hiệu quả của bạn đến khi có 2 công việc cho một danh mục. Bây giờ một người đang làm việc..và mọi người khác đang chờ đợi bận rộn.

Bạn có thể làm điều này đủ tốt bằng cách yêu cầu nhân viên quét qua hàng đợi cho một nhiệm vụ có thể thực hiện tiếp theo, sau đó trả lại mọi thứ trừ thứ đó cho hàng đợi nếu họ tìm thấy. Thay phiên trả lại mọi thứ, sau đó ngủ. Nếu giấc ngủ có một chút ngẫu nhiên và sự thụt lùi theo cấp số nhân, thì "chờ đợi bận rộn" sẽ không quá bận rộn.

Đối với một cách tiếp cận hiệu quả hơn, một công nhân nắm bắt một công việc có trách nhiệm thực hiện thể loại đó cho đến khi không còn gì khác trong danh mục đó để làm. Sau đó, bạn trở lại làm công nhân bình thường. Nhưng có một số sự tinh tế.

Để xem những thứ đó, giả sử chúng ta có thể tryreleasekhóa (cả không chặn) và các hoạt động xếp hàng của chúng ta add, getis_emptyvới hoạt động là getmột khối và chờ.

Chúng tôi sẽ giả sử một hàng đợi chung, và sau đó cho mỗi danh mục một hàng đợi và một khóa.

Đây là dòng công nhân cơ bản.

while obj = get from main queue:
    if try category lock:
        do obj job
        do_whole_category_queue()
    else:
        add obj to category queue
        if try category lock:
            do_whole_category_queue()

Ở đâu

procedure do_whole_category_queue
    while not category queue is_empty:
        obj = get from category queue
        do obj job
    release category lock
    if not is_empty category queue:
        if try category lock:
            do_whole_category_queue()

Lưu ý bắt tay khóa cẩn thận ở đây. Công nhân kiểm tra khóa và nếu nó bị khóa sẽ thêm công việc vào hàng đợi. Nhưng sau đó, bạn phải kiểm tra khóa một lần nữa để xác minh rằng đó vẫn là trách nhiệm của người khác khi thực sự thực hiện công việc. Chỉ trong trường hợp nhân viên thể loại kết thúc trong khi bạn đang thực hiện thao tác xếp hàng.

(Đây là loại chi tiết khóa mà mọi người thường làm hỏng. Lỗi sẽ không thể tái tạo một cách đáng tin cậy, nhưng bắt vít ngẫu nhiên và không thể sửa chữa trong sản xuất ...)


Nếu có thể là bất kỳ số lượng các loại sẽ khó để mở rộng nó l. Nhìn chung, nếu nó ở trong một môi trường xa xôi. Ngoài ra, để tránh 2 công nhân từ các thời gian chạy khác nhau tiêu thụ cùng một công việc, bạn sẽ không thể kiểm tra hàng đợi chiến lược từ tất cả các thời gian chạy khác. Tôi sẽ chọn một hàng đợi / công nhân chính như một nhiệm vụ gửi đi hoặc phân phối MasterQueues với MasterWork + bộ đệm ngang. Ngay cả cách tiếp cận đầu tiên (như một dịch vụ) tôi sẽ sử dụng bộ đệm. Sau đó, khả năng mở rộng vẫn là về cách làm cho bộ đệm này được cân bằng và đồng bộ hóa. Chặn hàng đợi không phải là vấn đề nếu bạn đặt thời gian chờ thành yêu cầu
Laiv

1
Hàng đợi khá rẻ. Những người có khả năng vẫn còn ngắn thậm chí còn rẻ hơn. Nếu bạn đã có dưới, giả sử, 100k danh mục thì điều này sẽ không thành vấn đề. Trong một loại nhận xét ánh xạ tới các tài nguyên phần cứng là các kết nối mở trên các cổng cụ thể, vì vậy chúng tôi không thể vượt quá giới hạn đó.
btilly
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.