Dường như vì truy cập vào dữ liệu mảng NumPy không yêu cầu các cuộc gọi vào trình thông dịch Python, phần mở rộng C có thể thao tác các mảng sau khi phát hành GIL. Ví dụ: trong this thread.Truy cập đa luồng vào Python bytearray
Việc xây dựng trong Python loại bytearray hỗ trợ Buffer Protocol, một thành viên trong số đó là
trống * buf
Một con trỏ đến đầu của cấu trúc logic được mô tả bởi các lĩnh vực đệm . [...] Đối với các mảng tiếp giáp, giá trị trỏ đến phần đầu của bộ nhớ khối.
Câu hỏi của tôi là, một phần mở rộng C có thể thao tác này buf sau khi phát hành GIL (Py_BEGIN_ALLOW_THREADS) kể từ khi truy cập vào nó không còn đòi hỏi các cuộc gọi đến các API Python C? Hay bản chất của trình thu gom rác Python cấm điều này, vì dấu ngắt quãng và buf của nó, có thể được di chuyển trong khi thực hiện?
Cấu trúc 'Py_buffer' giữ tham chiếu và không thể thay đổi kích thước' bytearray' cho đến khi tất cả xuất bộ đệm đã được giải phóng (tức là trong khi 'ob_exports> 0'). – eryksun
Cảm ơn - và tôi lấy điều đó để có nghĩa là quá rằng buf sẽ không được di chuyển (trái ngược với phát hành) bởi GC trong khi bộ đệm được xuất khẩu? Liệu Python có sử dụng [GC chuyển động] (http://en.wikipedia.org/wiki/Garbage_collection_ (computer_science) # Moving_vs._non-moving) không? – jpavel
'bytearray' được deallocated khi số tham chiếu đạt 0. Python cố gắng GC để giải quyết chu kỳ tham chiếu trong các loại container (ví dụ: danh sách, các lớp). – eryksun