2013-02-17 23 views
5

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_InitThreadsimplicitly 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?

+0

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. –

Trả lời

3

Hầu hết các ứng dụng không bao giờ cần biết về PyEval_InitThreads().

Thời gian duy nhất bạn nên sử dụng là nếu ứng dụng nhúng hoặc mô-đun mở rộng của bạn sẽ thực hiện cuộc gọi API C từ nhiều hơn một sợi mà nó sinh ra chính nó bên ngoài Python.

Đừng gọi PyEval_ReleaseLock() trong bất kỳ chủ đề nào mà sau này sẽ thực hiện cuộc gọi API C Cc (trừ khi bạn nhận lại nó trước những cuộc gọi đó). Trong trường hợp đó, bạn nên sử dụng các macro Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS thay thế.

+1

Tôi không hiểu câu trả lời này. Giả sử bạn đang nhúng Python vào một chương trình C và bạn có 20 luồng công nhân, nên gọi PyEval_InitThreads và cách mỗi nhân viên giải phóng khóa trong khi nó đang thực hiện những thứ khác để các chủ đề khác cần thực hiện một số công việc Python có thể nhận được GIL ? – DougN

+0

@DougN, vâng tôi đồng ý. Câu trả lời là mơ hồ (như là các tài liệu Python không may) –

+2

Nếu bạn đang nhúng Python i một chương trình C, hãy gọi nó một lần cho toàn bộ chương trình khi bạn khởi tạo trình thông dịch Python được nhúng trước khi nó thực thi mã Python đầu tiên của bạn. – gps