2011-12-12 38 views
8

Tôi đang thử nghiệm một DLL C++ đa luồng. DLL này được cho là an toàn thread. Tôi có nó bọc với boost.python, và tôi muốn tạo nhiều chủ đề python để thực thi DLL thông qua trình bao bọc boost.python. Tôi thực sự đang đang cố gắng để gây ra vấn đề về luồng. Những gì tôi không thể tìm thấy tài liệu tốt là liệu trình thông dịch python có hỗ trợ hai luồng của nó (trên các lõi khác nhau), đồng thời gọi vào một mô-đun đã nhập hay không và liệu GIL có cần chăm sóc hay không Tôi không muốn thêm bất kỳ sự an toàn nào trên những gì mà DLL được cho là cung cấp.Đa luồng thực với boost.python

Bất cứ ai có thể mô tả hoặc giới thiệu tôi mô tả về các mô-đun DLL gọi python từ nhiều luồng và cách GIL được sử dụng trong trường hợp này?

+0

Dường như bạn sẽ phải tự mình giải phóng GIL, nếu không bạn sẽ không có nhiều hơn một chuỗi chạy cùng một lúc. Xem http://stackoverflow.com/questions/1576737/releasing-python-gil-in-c-code – lvella

+1

Đây có phải là bản sao của http://stackoverflow.com/questions/8009613/ không? –

+0

Một câu hỏi phụ: nếu tôi không phát hành GIL, và mã C++ được gọi là từ Python tạo ra một chủ đề, có thể thread này gọi mã python một cách an toàn hay không. Tôi cho rằng không phải vì nó sẽ giải thích một vụ tai nạn tôi nhận được ... – MatthieuW

Trả lời

1

Câu trả lời là không, GIL sẽ không bao giờ thực sự multi-thread trừ khi DLL bằng tay ra mắt khóa. Python cho phép chính xác một luồng để chạy cùng một lúc trừ khi phần mở rộng theo cách thủ công nói, "Tôi bị chặn, tiếp tục mà không có tôi." Điều này thường được thực hiện với macro Py_BEGIN_ALLOW_THREADS (và hoàn tác với Py_END_ALLOW_THREADS) được định nghĩa trong python's include/ceval.h. Khi phần mở rộng thực hiện điều này, python sẽ cho phép một luồng khác chạy, và thread đầu tiên thực hiện bất kỳ công cụ python nào có thể gây ra vấn đề (như chú thích câu hỏi bình luận.) Nó thực sự có nghĩa là chặn I/O hoặc đi vào thời gian tính toán nặng.