2010-03-15 26 views
6

Cụm máy chủ của chúng tôi bao gồm 20 máy, mỗi máy có 10 pid gồm 5 chủ đề. Chúng tôi muốn một số cách để ngăn chặn bất kỳ hai chủ đề, trong bất kỳ pid, trên bất kỳ máy tính, từ sửa đổi cùng một đối tượng cùng một lúc.Một số cách tốt để thực hiện khóa liên thông là gì?

Mã của chúng tôi được viết bằng Python và chạy trên Linux, nếu điều đó giúp thu hẹp mọi thứ.

Ngoài ra, có một trường hợp hiếm hoi mà hai chủ đề như vậy muốn thực hiện điều này, vì vậy chúng tôi muốn thứ gì đó tối ưu hóa trường hợp "chỉ một chủ đề cần đối tượng này" rất nhanh, ngay cả khi nó có nghĩa là " một chủ đề đã khóa đối tượng này và một chủ đề khác cần nó "trường hợp không phải là tuyệt vời.

Một số phương pháp hay nhất là gì?

+0

Bạn làm cách nào để liên lạc giữa các quá trình? Bạn có sử dụng bất kỳ triển khai MPI Python nào không, hoặc bạn có sử dụng hệ thống tệp hay không? – stephan

Trả lời

5

Nếu bạn muốn đồng bộ hóa với các máy khác bạn cần một Distributed Lock Manager.

Tôi đã thực hiện một số cách nhanh chóng và đưa ra: Stackoverflow. Thật không may họ chỉ đề xuất phiên bản Java, nhưng đó là một sự khởi đầu.

Nếu bạn đang cố gắng đồng bộ hóa quyền truy cập vào tệp: Hệ thống tệp của bạn đã có sẵn một số dịch vụ khóa tại chỗ. Nếu không xem xét thay đổi nó.

-3

Có thể có một cách tốt hơn để làm điều này, nhưng tôi sẽ sử dụng lớp Khóa từ mô-đun threading để truy cập vào "bảo vệ" các đối tượng trong một với tuyên bố, đây sẽ là một ví dụ:

from __future__ import with_statement  
from threading import Lock 

mylock = Lock() 
with mylock.acquire(): 
    [ 'do things with protected data here' ] 
[ 'the rest of the code' ] 

để biết thêm ví dụ về cách sử dụng Khóa, hãy xem here.

Edit: giải pháp này là không thích hợp cho câu hỏi này như threading.Lock không phân phối, xin lỗi

+1

Không được phân phối. –

+0

Ồ, không nghĩ về điểm đó: s – MatToufoutu

3

Tôi cho rằng bạn đã xem qua bài đăng trên blog này http://amix.dk/blog/post/19386 trong quá trình googling của bạn?

Tác giả trình bày một giao diện đơn giản để memcachedb mà nó sử dụng như một trình quản lý khóa phân tán giả. Đó là một ý tưởng tuyệt vời và memcache có lẽ là một trong những điều nhanh nhất bạn có thể giao tiếp. Lưu ý rằng nó sử dụng số được thêm gần đây nhất với câu lệnh.

Đây là một cách sử dụng ví dụ từ bài viết trên blog của mình:

from __future__ import with_statement 
import memcache 
from memcached_lock import dist_lock 

client = memcache.Client(['127.0.0.1:11211']) 
with dist_lock('test', client): 
    print 'Is there anybody out there!?' 
1

Viết mã sử dụng đối tượng không thay đổi. Viết các đối tượng thực hiện mẫu Singleton.

Sử dụng công nghệ nhắn tin phân tán ổn định như IPC, webservices hoặc XML-RPC.

Tôi sẽ xem xét Twisted. Họ có rất nhiều giải pháp cho công việc như vậy.

Tôi sẽ không sử dụng các chủ đề trong Python esp liên quan đến GIL, tôi sẽ xem xét sử dụng Quy trình làm ứng dụng đang hoạt động và sử dụng công nghệ giao tiếp như được mô tả ở trên để liên lạc.

Lớp singleton của bạn sau đó có thể xuất hiện trong một trong các ứng dụng này và giao tiếp thông qua công nghệ mà bạn chọn.

Không phải là giải pháp nhanh với tất cả các giao diện, nhưng nếu được thực hiện đúng sẽ ổn định.

1

nếu bạn có thể nhận được cơ sở hạ tầng hoàn chỉnh cho trình quản lý khóa được phân phối, hãy tiếp tục và sử dụng. Nhưng cơ sở hạ tầng đó không dễ cài đặt! Nhưng đây là giải pháp thực tế:

-đặt nút bằng địa chỉ IP thấp nhất làm nút chính (điều đó có nghĩa là nếu nút có địa chỉ ip thấp nhất bị treo, nút mới có địa chỉ IP thấp nhất sẽ trở thành cái mới)

-cho phép tất cả các nút liên hệ với nút chính để lấy khóa trên đối tượng.

-cho nút chính sử dụng ngữ nghĩa khóa gốc để lấy khóa.

điều này sẽ đơn giản hóa mọi thứ trừ khi bạn cần cơ sở hạ tầng cụm hoàn chỉnh và DLM để thực hiện công việc.

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