Tiêu đề có nó, nhưng đây là một số chi tiết. Giả sử thread chính sinh ra một luồng khác, trong đó một số mã được nạp vào trình thông dịch python và sau đó một luồng khác được gọi là thực hiện một số mã khác thông qua giao diện python tương tự (thông qua PyImport hoặc PyRun). Kịch bản đó có khả thi không?Hai luồng có thể sử dụng cùng một trình thông dịch python được nhúng cùng một lúc không?
Trả lời
Nếu tôi đang theo dõi những gì bạn đang yêu cầu, sau đó có bạn có thể làm điều này, nhưng bản thân trình thông dịch Python không hoàn toàn an toàn. Để giải quyết vấn đề này, bạn phải đảm bảo mỗi luồng nhận được thông dịch viên GIL trước khi gọi bất kỳ mã Python nào và sau đó giải phóng nó sau đó. tức là mỗi chủ đề cần phải làm khi thực thi mã Python sau:
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
// Do any needed Python API operations, execute python code
// Release the GIL. No Python API allowed beyond this point.
PyGILState_Release(gstate);
Ngoài ra bạn nên làm như sau sau khi bắt đầu phiên dịch Python để đảm bảo đề/GIL được khởi động đúng cách:
if (! PyEval_ThreadsInitialized()) {
PyEval_InitThreads();
}
Xem Non Python Created Threads cho thêm thông tin về điều này.
Như đã đề cập trong các nhận xét, cần lưu ý rằng đây thực sự là việc truy cập tuần tự tới trình thông dịch, nhưng tốt nhất bạn có thể giả sử bạn đang sử dụng triển khai CPython của Python.
Bạn có chắc chắn, Epic? Nó chắc chắn trông giống như bạn đang ở (tốt nhất ...) * serializing * sử dụng thread của một cá thể phiên dịch đơn. Dường như với tôi rằng OP muốn mỗi luồng (C++) có một trình thông dịch Python riêng và có thể chạy song song, với luồng được thực hiện bởi C++, không phải Python. Hoặc, tôi có đọc sai ý định của OP không? –
@MikeRobinson Tôi nghĩ anh ấy muốn hai chủ đề chia sẻ cùng một thông dịch viên. – mshildt
Vâng, và, mặc dù "chuỗi" của Python là "chỉ" loại "chủ đề" (bởi vì, tất nhiên, Python là một thông dịch viên ...), tôi đã nghĩ rằng tôi sẽ đặt luồng của mình vào mã Python. Chúng ta biết rằng Python quản lý một cách chính xác * phiên bản luồng * của nó ... –
- 1. Có thể tạo hai trường hợp cùng một lúc không?
- 2. plot3D - có hai ô cùng một lúc
- 3. Tại sao có thể sử dụng cùng một cổng trên TCP và UDP cùng một lúc?
- 4. Liệt kê hai danh sách python cùng một lúc?
- 5. Does python os.fork sử dụng cùng một trình thông dịch python?
- 6. Nhiều Giao dịch PayPal cùng một lúc
- 7. Hai quy trình đọc/ghi vào cùng một tệp Python
- 8. Sử dụng cùng một trình mô phỏng android mọi lúc
- 9. Sử dụng accept() và chọn() cùng một lúc?
- 10. Có thể sử dụng hai lớp java có cùng tên và cùng một gói không?
- 11. Có thể chạy nhiều AsyncTask cùng một lúc không?
- 12. khối `pthread_mutex_trylock` khi được gọi bởi hai luồng cùng một lúc
- 13. Có thể pip.conf chỉ định hai chỉ mục-url cùng một lúc không?
- 14. Phát hai video trong một VideoView cùng một lúc
- 15. Cách sử dụng T4 để tạo hai tệp cùng một lúc từ một mẫu?
- 16. Nhiều luồng có thể ghi dữ liệu vào một tệp cùng lúc không?
- 17. Trong HTML5, tôi có thể phát cùng một âm thanh nhiều lần cùng một lúc không?
- 18. Có cách nào để ngăn không cho hai chương trình Python thực thi cùng một nhị phân cùng một lúc không?
- 19. Làm thế nào để sử dụng cùng một phụ kiện Usb cho hai ứng dụng cùng một lúc?
- 20. Có thể xem nhiều nhánh git cùng một lúc cho cùng một dự án không?
- 21. Trộn hai danh sách cùng một lúc với cùng một thứ tự
- 22. Hai cột không thể được null cùng một lúc trong sql
- 23. Yii Sử dụng mongo DB và MySQL cùng một lúc
- 24. Máy chủ SQL: Có thể chèn vào hai bảng cùng một lúc không?
- 25. có thể sử dụng Hibernate và Tomcat Connection pool cùng một lúc không?
- 26. Tôi có thể sử dụng jQuery find() cho nhiều loại phần tử cùng một lúc không?
- 27. Nhiều chủ đề gọi cùng một đối tượng cùng một lúc. Nó có thể gây ra vấn đề không?
- 28. Sử dụng WebStorm và IntelliJ cùng một lúc
- 29. Tôi có thể sử dụng hai lisp + slime/swanks khác nhau từ cùng một emacs không?
- 30. Hàm jQuery ready() có thể được sử dụng hai lần cho cùng một phần tử không?
Bạn muốn hai chuỗi chia sẻ cùng một trình thông dịch được nhúng phải không? – mshildt
@epicbrew yep, cùng một thông dịch viên, cả hai chủ đề có quyền truy cập vào cùng một bộ nhớ – user3496846