2012-02-12 25 views
13

Tôi đang gặp một chút rắc rối khi quyết định sử dụng bất kỳ bộ xử lý python hoặc cần tây hoặc trang cho ứng dụng của tôi.Là cần thiết như hiệu quả trên một hệ thống địa phương như python multiprocessing là?

Ứng dụng của tôi rất nặng CPU nhưng hiện chỉ sử dụng một CPU nên tôi cần trải rộng trên tất cả các CPU có sẵn (điều này khiến tôi nhìn vào thư viện đa xử lý của python) nhưng tôi đọc thư viện này không mở rộng máy nếu cần. Ngay bây giờ tôi không chắc liệu tôi có cần nhiều hơn một máy chủ để chạy mã của mình hay không, nhưng tôi đang nghĩ đến việc chạy cần tây tại địa phương và sau đó mở rộng quy mô sẽ chỉ yêu cầu thêm máy chủ mới thay vì tái cấu trúc mã (vì nếu tôi sử dụng đa xử lý).

Câu hỏi của tôi: logic này có đúng không? và có bất kỳ tiêu cực (hiệu suất) với việc sử dụng cần tây tại địa phương (nếu nó quay ra một máy chủ duy nhất với nhiều lõi có thể hoàn thành nhiệm vụ của tôi)? hoặc là nó khuyên nhiều hơn để sử dụng đa xử lý và phát triển ra khỏi nó vào cái gì khác sau này?

Cảm ơn!

p.s. điều này là dành cho một dự án học tập cá nhân nhưng tôi có lẽ một ngày nào đó muốn làm việc như một nhà phát triển trong một công ty và muốn tìm hiểu cách các chuyên gia làm điều đó.

+0

Điều gì khiến bạn nghĩ rằng nhiều CPU sẽ giúp ứng dụng nặng IO? Nếu ứng dụng của bạn là IO-bound thì bạn cần nhiều kênh IO, không phải CPU. –

+0

Đối diện với từ sai xin lỗi ... nó là rất nhiều CPU. Về cơ bản nó chỉ là toán học trong một đệ quy lớn với rất nhiều dữ liệu đầu vào. Dường như là một quy trình tốt để phân phối – Lostsoul

+0

Ah - trong trường hợp đó, tiếp tục :) Bạn có cần dung sai lỗi không - ví dụ, cố gắng sử dụng máy tính tình nguyện rải rác khắp nơi - hoặc bạn chỉ đang tìm cách sử dụng máy tính trong phòng thí nghiệm hoặc cluster? –

Trả lời

4

Tôi chưa bao giờ sử dụng Celery, nhưng tôi đã sử dụng đa xử lý.

Cần tây dường như có nhiều cách để truyền tải thông điệp (nhiệm vụ) xung quanh, bao gồm các cách mà bạn sẽ có thể chạy công nhân trên các máy khác nhau. Vì vậy, một nhược điểm có thể là thông điệp đi qua có thể chậm hơn so với đa xử lý, nhưng mặt khác, bạn có thể truyền tải đến các máy khác.

Bạn có quyền đa xử lý chỉ có thể chạy trên một máy. Nhưng mặt khác, giao tiếp giữa các quá trình có thể rất nhanh, ví dụ bằng cách sử dụng bộ nhớ dùng chung. Ngoài ra nếu bạn cần xử lý một lượng dữ liệu rất lớn, bạn có thể dễ dàng đọc và ghi dữ liệu từ và tới đĩa cục bộ và chỉ cần truyền tên tệp giữa các quy trình.

Tôi không biết Celery sẽ đối phó với thất bại nhiệm vụ như thế nào. Ví dụ: tác vụ có thể không bao giờ kết thúc chạy hoặc có thể bị lỗi hoặc bạn có thể muốn có khả năng giết một tác vụ nếu nó không kết thúc trong một thời gian nhất định. Tôi không biết sẽ khó khăn như thế nào để thêm hỗ trợ cho điều đó nếu nó không có ở đó.

đa xử lý không có khả năng chịu lỗi ngoài hộp, nhưng bạn có thể tự xây dựng mà không gặp quá nhiều rắc rối.

+2

Cần tây thực sự có nhiều chi phí hơn bằng cách sử dụng đa xử lý.Đồ dùng trực tiếp, vì phí trên máy nhắn tin. Celery giao dịch rất tốt với thất bại nhiệm vụ dưới bất kỳ hình thức nào, nó cũng hỗ trợ giới hạn thời gian và nhiều, nhiều hơn nữa. Celery sử dụng phiên bản cải tiến của Multirocessing Pool (celery.concurrency.processes.pool.Pool), hỗ trợ giới hạn thời gian và sửa nhiều lỗi liên quan đến việc chạy Pool như một dịch vụ (tức là chạy mãi mãi) và các lỗi liên quan đến tắt máy. Một số người sử dụng phiên bản hồ bơi của Celery. – asksol

+0

Một số liên kết: http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks Tùy chọn hồ bơi: http://docs.celeryproject.org/en/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool http://docs.celeryproject.org/ vi/latest/internals/reference/celery.concurrency.processes.pool.html # celery.concurrency.processes.pool.Pool.apply_async – asksol

+2

Bạn cũng có thể phân phối công việc trên các máy bằng cách sử dụng đa xử lý, nhưng tôi không khuyên bạn nên thực hiện điều đó. Làm cho nó có chất lượng sản xuất có lẽ sẽ mất nhiều công sức, và Celery đã có một cộng đồng đang giải quyết những vấn đề này. – asksol

17

Tôi vừa hoàn thành một bài kiểm tra để quyết định cần bao nhiêu cần tây như trên không trên multiprocessing.Pool và mảng được chia sẻ. Thử nghiệm chạy bộ lọc wiener trên một mảng uint16 (292, 353, 1652). Cả hai phiên bản sử dụng cùng một đoạn (khoảng: chia kích thước 292.353 bởi căn bậc hai của số lượng cpu có sẵn). Hai phiên bản cần tây đã được thử: một giải pháp gửi dữ liệu được chọn lọc, một giải pháp khác sẽ mở tệp dữ liệu cơ bản trong mỗi công nhân.

Kết quả: trên 16 lõi CPU i7 cần tây của tôi mất khoảng 16 giây, multiprocessing.Pool với mảng được chia sẻ khoảng 15 giây. Tôi thấy sự khác biệt này đáng ngạc nhiên nhỏ.

Tăng độ chi tiết làm tăng sự khác biệt rõ ràng (cần tây phải truyền nhiều thông điệp hơn): cần tây mất 15 giây, multiprocessing.Pool mất 12 giây.

Hãy xem xét nhân viên cần tây đã chạy trên máy chủ trong khi nhân viên của bể bơi được chia đôi ở mỗi lần chạy.Tôi không chắc chắn làm thế nào tôi có thể bắt đầu đa xử hồ bơi ngay từ đầu kể từ khi tôi vượt qua các mảng chia sẻ trong initializer:

with closing(Pool(processes=mp.cpu_count(), initializer=poolinit_gen, initargs=(sourcearrays, resarrays))) as p: 

và chỉ có resarrays được bảo vệ bằng cách khóa.

+1

Tôi quản lý để tách các thiết lập hồ bơi từ đo lường nhưng điều đó hầu như không có sự khác biệt (như dự kiến, ngã ba là giá rẻ). Đang thử với một tập dữ liệu khác (276, 385, 3821): cần tây thông qua chuyển giao ngâm 38, đa xử lý. 27 giây. Thành thật mà nói tôi thấy cần tây thoải mái hơn nhiều khi làm việc với nó và nó có thể tự động ủy thác chế biến cho các máy khác trong trường hợp thời gian xử lý thực sự dài hơn thời gian chuyển. Trên một máy duy nhất, sự khác biệt hiệu suất chỉ đáng chú ý đối với các tập dữ liệu lớn. –