2011-09-22 39 views
5

Tôi có một chương trình python với nhiều luồng. Mỗi chủ đề phát hiện sự kiện, mà tôi muốn lưu trữ ở đâu đó để tôi có thể đọc lại chúng (để thử nghiệm). Ngay bây giờ, tôi đang sử dụng Pickle để xuất ra các sự kiện và mỗi luồng sẽ xuất ra một tệp khác. Lý tưởng nhất, tôi sẽ chỉ sử dụng một tập tin đầu ra, và tất cả các chủ đề sẽ viết cho nó, nhưng khi tôi cố gắng này, có vẻ như các chủ đề khác nhau cố gắng để viết đầu ra của họ cùng một lúc, và họ không nhận được ngâm đúng cách. Có cách nào để làm việc này không?Làm sạch từ nhiều chủ đề trong Python

Trả lời

4

có vẻ như một nơi tốt để sử dụng một số Queue.

  • Đề nghị tất cả chủ đề phát hiện sự kiện của bạn đặt các mục vào Hàng đợi được chia sẻ.
  • Tạo một chuỗi khác để nhận các mục từ hàng đợi và viết/chọn/bất kỳ thứ gì từ chuỗi này.

từ các tài liệu Queue:

"Các module Queue thực hiện đa sản xuất, hàng đợi đa tiêu dùng Nó đặc biệt hữu ích trong việc lập trình ren khi thông tin phải trao đổi một cách an toàn giữa nhiều chủ đề.. Lớp Queue trong mô-đun thực hiện tất cả các ngữ nghĩa khóa bắt buộc. Nó phụ thuộc vào khả năng hỗ trợ luồng trong Python; xem mô-đun luồng . "

2

Có, với threading.Lock() đối tượng. Bạn tạo khóa trước khi tạo tất cả các chủ đề của mình, bạn đưa nó vào phương thức chịu trách nhiệm lưu/xóa các mục và phương pháp này sẽ lấy khóa trước khi ghi vào tệp và phát hành sau.

1

Bạn có thể tạo lock và nhận/giải phóng nó xung quanh mọi cuộc gọi đến pickle.dump().

1

Mô-đun logging có một số Rlock được tích hợp trong Trình xử lý của nó. Vì vậy, bạn có thể logging như bình thường (chỉ cần tạo trình xử lý để đăng nhập vào một tệp.)

1

Dưới đây là một ví dụ sử dụng threading.Lock():

import threading 
import pickle 
picke_lock = threading.Lock() 
    def do(s): 
     picke_lock.acquire() 
     try: 
      ps = pickle.dumps(s) 
     finally: 
      picke_lock.release() 
     return ps 

t1 = threading.Thread(target=do, args =("foo",)) 
t2 = threading.Thread(target=do, args =("bar",)) 
p1 = t1.start() 
p2 = t2.start() 

inpt = raw_input('type anything and click enter... ') 
Các vấn đề liên quan