2009-05-20 45 views
6

Tôi gặp sự cố khi cần x chuỗi để chờ cho đến khi tất cả các chủ đề đạt đến điểm đồng bộ hóa. Giải pháp của tôi sử dụng phương thức synchronise dưới đây được gọi bởi mỗi hàm luồng khi chúng cần đồng bộ hóa.Đồng bộ nhiều chủ đề trong python

Có cách nào tốt hơn để thực hiện việc này không?

thread_count = 0 
semaphore = threading.Semaphore() 
event = threading.Event() 

def synchronise(count): 
    """ All calls to this method will block until the last (count) call is made """ 
    with semaphore: 
     thread_count += 1 
     if thread_count == count: 
      event.set() 

    event.wait() 

def threaded_function(): 
    # Do something 

    # Block until 4 threads have reached this point 
    synchronise(4) 

    # Continue doing something else 

Trả lời

1

Có nhiều cách để đồng bộ hóa chủ đề. Nhiều người.

Ngoài đồng bộ hóa, bạn có thể thực hiện những việc như sau.

  1. Chia công việc của bạn thành hai bước xung quanh điểm đồng bộ hóa. Bắt đầu chuỗi làm bước đồng bộ hóa trước. Sau đó sử dụng "tham gia" để chờ cho đến khi tất cả các chủ đề kết thúc bước 1. Bắt đầu chủ đề mới làm bước sau đồng bộ. Tôi thích điều này, hơn đồng bộ hóa.

  2. Tạo hàng đợi; có được một khóa đồng bộ hóa. Bắt đầu tất cả các chủ đề. Mỗi luồng đặt một mục trong hàng đợi và chờ trên khóa đồng bộ hóa. Các chủ đề "chính" nằm trong một vòng lặp dequeueing mục từ hàng đợi. Khi tất cả các chủ đề đã đặt một mục trong hàng đợi, chuỗi "chính" sẽ giải phóng khóa đồng bộ hóa. Tất cả các chủ đề khác hiện được tự do chạy lại.

Có một số kỹ thuật giao tiếp liên bộ (IPC) - tất cả đều có thể được sử dụng để đồng bộ hóa luồng.

+0

tôi khám phá gợi ý đầu tiên của bạn, nhưng có một nhu cầu để có bài làm cả hai trước khi đồng bộ hóa và sau khi đồng bộ hóa công việc mà không chia nỗ lực thành 2 nhiệm vụ. Nếu tôi không có ràng buộc này, giải pháp của bạn sẽ là lý tưởng. –

+0

Vì tất cả các chủ đề chia sẻ cùng một bộ nhớ chính xác, không rõ tại sao các luồng của bạn không thể bị phân tách thành hai bước. Thông tin được tạo trước đồng bộ hóa sẽ hoàn toàn có sẵn cho các chủ đề mới để sử dụng sau synch. –

2

Chức năng bạn muốn được gọi là "barrier". (Thật không may rằng thuật ngữ có 2 ý nghĩa khi nói về luồng Vì vậy, nếu bạn Google nó, chỉ cần bỏ qua các bài viết nói về "memory barriers" - đó là một điều rất khác nhau).

Mã của bạn có vẻ khá hợp lý - nó đơn giản và an toàn.

Tôi không thể tìm thấy bất kỳ triển khai rào cản "chuẩn" nào cho Python, vì vậy tôi khuyên bạn nên tiếp tục sử dụng mã của mình.

2

Lưu ý rằng Barrier đã được thực hiện as of Python 3.2

Ví dụ của việc sử dụng các rào cản:

from threading import Barrier, Thread 

def get_votes(site): 
    ballots = conduct_election(site) 
    all_polls_closed.wait()  # do not count until all polls are closed 
    totals = summarize(ballots) 
    publish(site, totals) 

all_polls_closed = Barrier(len(sites)) 
for site in sites: 
    Thread(target=get_votes, args=(site,)).start() 
Các vấn đề liên quan