Tôi có một số chức năng mà tương tác nạp module python sử dụng __import__
nhập khẩu bên trong của một sợi Python
thời gian gần đây tôi stumbled khi một số bài viết về một "khóa nhập khẩu" bằng Python, có nghĩa là, một khóa đặc biệt cho hàng nhập khẩu (không chỉ GIL). Nhưng bài viết đã cũ nên có lẽ điều đó không còn đúng nữa.
Điều này khiến tôi băn khoăn về việc thực hành nhập trong chuỗi.
- Are
import
/__import__
có an toàn không? - Họ có thể tạo khóa chết không?
- Chúng có thể gây ra các vấn đề về hiệu suất trong ứng dụng luồng không?
EDIT 12 tháng 9 năm 2012
Cảm ơn bạn đã trả lời lớn Soravux. Vì vậy, nhập khẩu là chủ đề an toàn, và tôi không lo lắng về deadlocks, kể từ khi các chức năng sử dụng __import__
trong mã của tôi không gọi cho nhau.
Bạn có biết khóa có được mua ngay cả khi mô-đun đã được nhập không? Nếu đúng như vậy, có lẽ tôi nên tìm trong sys.modules để kiểm tra xem mô-đun đã được nhập chưa trước khi thực hiện cuộc gọi đến __import__
.
Chắc chắn điều này sẽ không tạo ra nhiều khác biệt trong CPython vì có GIL. Tuy nhiên, nó có thể tạo ra rất nhiều sự khác biệt về các triển khai khác như Jython hoặc python stackless.
EDIT 19 tháng chín năm 2012
Về Jython, đây là những gì họ nói trong doc:
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
Python hiện, tuy nhiên, xác định một khóa mô-đun nhập khẩu, đó là thực hiện bởi Jython. Khóa này được mua bất cứ khi nào nhập bất kỳ tên nào. Điều này đúng cho dù việc nhập có đi qua câu lệnh nhập , nội dung tương đương
__import__
hoặc mã có liên quan hay không. Đó là điều quan trọng cần lưu ý là ngay cả khi mô-đun tương ứng đã nhập , khóa nhập mô-đun sẽ vẫn được mua lại nếu chỉ một thời gian ngắn.
Vì vậy, có vẻ như bạn nên kiểm tra sys.modules trước khi nhập, để tránh bị khóa. Bạn nghĩ sao?
Tôi tưởng tượng chúng là chủ đề an toàn, vì như bạn nói, trình thông dịch sẽ chặn các lần nhập. Tôi muốn được quan tâm để tìm hiểu xem họ có thể gây ra deadlocks trong bất kỳ cách nào khác hơn so với điển hình không luồng thông tư nhập khẩu. –