Tôi đã không làm việc với luồng trong Python ở tất cả và hỏi câu hỏi này như một người lạ hoàn toàn.Is collections.defaultdict thread-safe?
Tôi tự hỏi nếu defaultdict
là an toàn chỉ. Hãy để tôi giải thích nó:
Tôi có
d = defaultdict(list)
mà tạo ra một danh sách cho thiếu phím theo mặc định. Giả sử tôi có nhiều chủ đề bắt đầu thực hiện việc này cùng một lúc:
d['key'].append('value')
Cuối cùng, tôi phải kết thúc bằng ['value', 'value']
. Tuy nhiên, nếu defaultdict
không phải là thread-safe, nếu thread 1 sản lượng để chủ đề 2 sau khi kiểm tra if 'key' in dict
và trước d['key'] = default_factory()
, nó sẽ gây ra đan xen, và các chủ đề khác sẽ tạo danh sách trong d['key']
và thêm 'value'
lẽ.
Sau đó, khi chuỗi 1 đang thực thi lại, nó sẽ tiếp tục từ d['key'] = default_factory()
sẽ hủy danh sách và giá trị hiện tại và chúng tôi sẽ kết thúc bằng ['key']
.
Tôi đã xem CPython source code for defaultdict. Tuy nhiên, tôi không thể tìm thấy bất kỳ ổ khóa hoặc mutexes. Tôi đoán nó không phải là thread-an toàn miễn là nó được ghi lại như vậy.
Một số người tối qua trên IRC cho biết rằng có GIL trên Python, vì vậy khái niệm chỉ an toàn về chủ đề. Một số nói luồng không nên được thực hiện bằng Python. Tôi khá bối rối. Ý tưởng?
https://groups.google.com/forum/#!topic/comp.lang.python/9ZnBQrYun1w có thể giúp –