Tôi hơi bối rối khi tôi phải gọi PyEval_InitThreads
. Nói chung, tôi hiểu rằng PyEval_InitThreads
phải được gọi bất cứ khi nào một chuỗi không phải Python (tức là một chủ đề được sinh ra trong một mô-đun mở rộng) được sử dụng.Khi nào PyEval_InitThreads được gọi là?
Tuy nhiên, tôi bị nhầm lẫn nếu PyEval_InitThreads
dành cho các chương trình C nhúng trình thông dịch Python hoặc chương trình Python nhập mô-đun mở rộng C hoặc cả hai.
Vì vậy, nếu tôi viết mô-đun mở rộng C sẽ khởi chạy nội bộ một chuỗi, tôi có cần gọi số PyEval_InitThreads
khi khởi tạo mô-đun không?
Ngoài ra, PyEval_InitThreads
implicitly acquires the Global Interpreter Lock. Vì vậy, sau khi gọi PyEval_InitThreads
, có lẽ GIL phải được phát hành hoặc bế tắc sẽ xảy ra sau đó. Vậy làm thế nào để bạn giải phóng khóa? Sau khi đọc tài liệu, PyEval_ReleaseLock()
dường như là cách để giải phóng GIL. Tuy nhiên, trong thực tế, nếu tôi sử dụng đoạn mã sau vào một mô-đun mở rộng C:
PyEval_InitThreads();
PyEval_ReleaseLock();
... sau đó khi chạy Python hủy bỏ với:
Fatal Python error: drop_gil: GIL is not locked
Vì vậy, làm thế nào để bạn thả GIL sau khi mua lại nó với PyEval_InitThreads
?
Thử không có 'PyEval_ReleaseLock()'. GIL được mua lại vì một lý do chính đáng; phát hành nó trước khi gọi các hàm API C khác từ Python sẽ bị lỗi. –