Tôi không rõ lý do tại sao API thông dịch viên phụ tồn tại và tại sao nó được sử dụng trong các mô-đun như mô đun apache mod_wsgi. Nó chủ yếu được sử dụng để tạo một sandbox bảo mật cho các ứng dụng khác nhau đang chạy trong cùng một quá trình, hay nó là một cách để cho phép đồng thời với nhiều luồng? Có thể là cả hai? Có mục đích nào khác không?Mục đích của API thông dịch viên phụ trong CPython là gì?
15
A
Trả lời
14
Tôi tưởng tượng mục đích là tạo môi trường thực thi python riêng biệt. Ví dụ: mod_wsgi (mô-đun Apache Python) lưu trữ một trình thông dịch python đơn và sau đó lưu trữ nhiều ứng dụng trong các trình thông dịch phụ (trong cấu hình mặc định).
Một số điểm quan trọng từ documentation:
- Đây là một (hầu như) môi trường hoàn toàn riêng biệt để thực hiện mã Python. Cụ thể, phiên dịch mới có các phiên bản riêng biệt, độc lập của tất cả các mô-đun đã nhập, bao gồm các mô-đun cơ bản
__builtin__
,__main__
vàsys
. - Bảng mô-đun nạp (sys.modules) và đường dẫn tìm kiếm mô-đun (sys.path) cũng tách biệt.
- Bởi vì thông dịch viên phụ (và thông dịch viên chính) là một phần của quá trình tương tự, cách ly giữa chúng không hoàn hảo - ví dụ: sử dụng các tác vụ tệp cấp thấp như os.close().) ảnh hưởng đến các tệp đang mở của nhau.
- Do cách tiện ích mở rộng được chia sẻ giữa các phiên dịch (phụ), một số tiện ích có thể không hoạt động bình thường; điều này đặc biệt có khả năng khi tiện ích mở rộng sử dụng các biến toàn cục (tĩnh) hoặc khi tiện ích xử lý từ điển của mô-đun sau khi khởi tạo.
0
Như tôi đã hiểu nó cuối cùng, ý tưởng là có thể thực hiện nhiều ứng dụng cũng như nhiều bản sao của cùng một ứng dụng trong cùng một quá trình.
Đây là một tính năng được tìm thấy trong ngôn ngữ kịch bản khác (ví dụ như TCL), và sử dụng đặc biệt để xây dựng gui, máy chủ web, vv
Nó phá vỡ trong python vì nhiều phần mở rộng không an toàn nhiều thông dịch viên, do đó, một hành động của thông dịch viên có thể ảnh hưởng đến các biến trong một thông dịch viên khác.
Các vấn đề liên quan
- 1. CPython là phiên dịch viên bytecode?
- 2. Mục đích của cuộc gọi api win32 CreateFile2 là gì?
- 3. JAF là gì? Mục đích của nó là gì?
- 4. Mục đích của Thư viện Dịch vụ WCF là gì?
- 5. Mục đích của thông tin băm là gì?
- 6. Mục đích của config.assets.precompile là gì?
- 7. Mục đích của Parse Vexing là gì?
- 8. mục đích là gì? "::" trong
- 9. Mục đích của phiên JMS là gì?
- 10. Mục đích của tệp .edmx là gì?
- 11. Mục đích của (<$) trong lớp Functor là gì?
- 12. Mục đích của tệp pdb là gì?
- 13. Mục đích của tệp vshost.exe là gì?
- 14. Mục đích của layout.xml là gì?
- 15. Mục đích của `__metaclass__ = type` là gì?
- 16. Mục đích của String.IsInterned là gì?
- 17. Mục đích của Rake là gì?
- 18. Mục đích của __cxa_pure_virtual là gì?
- 19. Mục đích của HttpHeaders.TryAddWithoutValidation là gì?
- 20. Mục đích của ldexp là gì?
- 21. Mục đích của IntentSender là gì?
- 22. Mục đích của requestWindowFeature() là gì?
- 23. Mục đích của nguyên mẫu là gì?
- 24. Mục đích của lớp Expression là gì?
- 25. Mục đích của startManagingCursor là gì?
- 26. Mục đích của phạm vi $ trong scala.Predef là gì?
- 27. Mục đích của UIWindow là gì?
- 28. Mục đích của character_set_connection là gì?
- 29. Mục đích của is_uploaded_file() là gì?
- 30. Mục đích của Array.GetLowerBound (int) là gì?
Điều này có nghĩa là các trình thông dịch khác nhau có thể chạy đồng thời trong các chuỗi khác nhau không? Tôi vẫn chưa rõ liệu có hay không các trình thông dịch khác nhau trong cùng một quá trình chia sẻ cùng một GIL. –
GIL là một đối tượng toàn cầu cho quá trình này và được chia sẻ giữa các phiên dịch phụ. Vì vậy, không, họ không thể chạy đồng thời. http://objectmix.com/python/377035-multiple-independent-python-interpreters-c-c-program.html – codeape
Cảm ơn bạn đã liên kết! Tôi đã cố gắng để tìm ra cho dù có bất kỳ cách nào xung quanh các hạn chế luồng của python và GIL, và tôi không đến với bất cứ điều gì. –