2011-10-19 43 views
10

Tôi có một đường ống mà tại một số điểm chia tách làm việc thành các tiểu quy trình khác nhau làm điều tương tự song song. Vì vậy, đầu ra của họ nên đi vào cùng một tập tin.Điều gì sẽ xảy ra nếu hai tập lệnh python muốn viết trong cùng một tệp?

Có quá mạo hiểm khi nói rằng tất cả các quy trình đó phải ghi vào cùng một tệp không? Hoặc không python thử và thử lại nếu nó thấy rằng tài nguyên này là chiếm đóng?

Trả lời

7

Nói chung, đây không phải là một ý tưởng hay và sẽ rất cẩn thận để có được quyền. Kể từ khi viết sẽ phải được đăng, nó cũng có thể ảnh hưởng xấu đến khả năng mở rộng.

Tôi khuyên bạn nên viết để tách các tệp và hợp nhất (hoặc chỉ để chúng dưới dạng tệp riêng biệt).

+0

Oh ok! Làm thế nào nó có thể ảnh hưởng đến khả năng mở rộng? Bạn có nghĩa là nếu đột nhiên rất nhiều quá trình muốn viết vào cùng một tập tin và giữ nhau lên? – dmeu

+0

@dmeu: Về cơ bản là nó. Nếu bạn có nhiều quy trình muốn viết cùng một lúc, chỉ một trong số họ có thể, và phần còn lại sẽ chỉ ngồi đó chờ đợi thay vì làm công việc hữu ích. – NPE

8

Đây là hệ thống phụ thuộc. Trong Windows, tài nguyên bị khóa và bạn nhận được một ngoại lệ. Trong Linux, bạn có thể ghi tệp bằng hai quy trình (dữ liệu văn bản có thể được trộn lẫn)

Lý tưởng nhất trong trường hợp này, bạn nên sử dụng semaphores để đồng bộ hóa quyền truy cập vào tài nguyên được chia sẻ.

Nếu sử dụng semaphore là quá nặng cho các nhu cầu của bạn, thì lựa chọn duy nhất là viết trong các tập tin riêng biệt ...

Sửa: Như đã chỉ ra bằng mắt trong a later post, một người quản lý tài nguyên là một thay thế cho xử lý các nhà văn đồng thời

3

Giải pháp tốt hơn là triển khai trình quản lý tài nguyên (người viết) để tránh mở cùng một tệp hai lần. Người quản lý này có thể sử dụng các cơ chế đồng bộ hóa luồng (threading.Lock) để tránh truy cập đồng thời trên một số nền tảng.

+0

Ok tôi sẽ phải xem xét tùy chọn này. Điều này cũng sẽ hoạt động trên một cụm, phải không? có nghĩa là trên một hệ thống mà các phép tính được thực hiện trên các máy tính khác nhau, nhưng chia sẻ hệ thống tập tin nơi chúng ghi kết quả của chúng – dmeu

+0

Các quá trình khác nhau không thể chia sẻ một luồng. – marcv81

1

Làm thế nào để có tất cả các quy trình khác nhau ghi đầu ra của chúng vào hàng đợi và có một quá trình đọc hàng đợi đó và ghi vào tệp?

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