Vì vậy, tôi thường có một sự hiểu biết khá tốt về cách Global Interpreter Lock (GIL) trong Python hoạt động. Về cơ bản, trong khi phiên dịch đang chạy, một luồng giữ GIL cho N ticks (trong đó N
có thể được thiết lập bằng cách sử dụng sys.setcheckinterval
), tại thời điểm đó GIL được giải phóng và một luồng khác có thể lấy GIL. Điều này cũng xảy ra nếu một luồng bắt đầu một hoạt động I/O.Python: GIL context - switching
Điều tôi hơi bối rối là cách tất cả điều này hoạt động với các mô-đun mở rộng C.
Nếu bạn có mô-đun mở rộng C mua lại GIL, và sau đó thực hiện một số mã python sử dụng PyEval_EvalCode
, trình thông dịch có thể giải phóng GIL và đưa nó cho một số chủ đề khác không? Hay chuỗi C có được GIL giữ GIL vĩnh viễn cho đến khi PyEval_EvalCode
trả về và GIL được phát hành rõ ràng trong C?
PyGILState gstate = PyGILState_Ensure();
....
/* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */
PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict);
PyGILState_Release(gstate);
Xem [câu hỏi liên quan] của tôi (http://stackoverflow.com/questions/29317120/forcing-a-thread-to-block-all-other-threads-from-executing). Tôi không hiểu làm thế nào để giải quyết sự không thống nhất dường như giữa tuyên bố của bạn và tuyên bố trong Python Cookbook. – max
Xem [Câu trả lời của Albert] (http://stackoverflow.com/a/29328066). –