2016-07-26 22 views
5

Tiêu đề có nó, nhưng đây là một số chi tiết. Giả sử thread chính sinh ra một luồng khác, trong đó một số mã được nạp vào trình thông dịch python và sau đó một luồng khác được gọi là thực hiện một số mã khác thông qua giao diện python tương tự (thông qua PyImport hoặc PyRun). Kịch bản đó có khả thi không?Hai luồng có thể sử dụng cùng một trình thông dịch python được nhúng cùng một lúc không?

+1

Bạn muốn hai chuỗi chia sẻ cùng một trình thông dịch được nhúng phải không? – mshildt

+0

@epicbrew yep, cùng một thông dịch viên, cả hai chủ đề có quyền truy cập vào cùng một bộ nhớ – user3496846

Trả lời

2

Nếu tôi đang theo dõi những gì bạn đang yêu cầu, sau đó có bạn có thể làm điều này, nhưng bản thân trình thông dịch Python không hoàn toàn an toàn. Để giải quyết vấn đề này, bạn phải đảm bảo mỗi luồng nhận được thông dịch viên GIL trước khi gọi bất kỳ mã Python nào và sau đó giải phóng nó sau đó. tức là mỗi chủ đề cần phải làm khi thực thi mã Python sau:

PyGILState_STATE gstate; 
gstate = PyGILState_Ensure(); 

// Do any needed Python API operations, execute python code 

// Release the GIL. No Python API allowed beyond this point. 
PyGILState_Release(gstate); 

Ngoài ra bạn nên làm như sau sau khi bắt đầu phiên dịch Python để đảm bảo đề/GIL được khởi động đúng cách:

if (! PyEval_ThreadsInitialized()) { 
    PyEval_InitThreads(); 
} 

Xem Non Python Created Threads cho thêm thông tin về điều này.

Như đã đề cập trong các nhận xét, cần lưu ý rằng đây thực sự là việc truy cập tuần tự tới trình thông dịch, nhưng tốt nhất bạn có thể giả sử bạn đang sử dụng triển khai CPython của Python.

+0

Bạn có chắc chắn, Epic? Nó chắc chắn trông giống như bạn đang ở (tốt nhất ...) * serializing * sử dụng thread của một cá thể phiên dịch đơn. Dường như với tôi rằng OP muốn mỗi luồng (C++) có một trình thông dịch Python riêng và có thể chạy song song, với luồng được thực hiện bởi C++, không phải Python. Hoặc, tôi có đọc sai ý định của OP không? –

+0

@MikeRobinson Tôi nghĩ anh ấy muốn hai chủ đề chia sẻ cùng một thông dịch viên. – mshildt

+0

Vâng, và, mặc dù "chuỗi" của Python là "chỉ" loại "chủ đề" (bởi vì, tất nhiên, Python là một thông dịch viên ...), tôi đã nghĩ rằng tôi sẽ đặt luồng của mình vào mã Python. Chúng ta biết rằng Python quản lý một cách chính xác * phiên bản luồng * của nó ... –

Các vấn đề liên quan