Hellotu Linux.
Is this python c api bug? The following C++ code (g++) deadlocks on Ubun=
=
/*=C2=A0* This code deadlocks on python3-dev 3.12.3 (ubuntu 24.04 lts) =C2=A0*ed`
=C2=A0* g++ python_thread_test.cpp `python3-config --cflags --libs --emb=
=C2=A0* ./a.outnux
=C2=A0*
=C2=A0* uname:
=C2=A0* Linux softice 6.8.0-36-generic SMP PREEMPT_DYNAMIC x86_64 GNU/Li=
=C2=A0*/
=
#include <Python.h>
#include <thread>
#include <vector>
#include <iostream>
=
void perform_long_operation() {
=C2=A0 =C2=A0 // Simulate a long-running task
=C2=A0 =C2=A0 std::this_thread::sleep_for(std::chrono::seconds(5));
}
=
void thread_function() {
=C2=A0 =C2=A0 // Ensure this thread has the GIL
=C2=A0 =C2=A0 PyGILState_STATE gstate =3D PyGILState_Ensure();
=
=C2=A0 =C2=A0 // Execute some Python code
=C2=A0 =C2=A0 PyRun_SimpleString("print('Hello from std::thread!')");
=
=C2=A0 =C2=A0 // Release the GIL for long operation
=C2=A0 =C2=A0 Py_BEGIN_ALLOW_THREADS
=C2=A0 =C2=A0 perform_long_operation();
=C2=A0 =C2=A0 Py_END_ALLOW_THREADS
=
=C2=A0 =C2=A0 // Re-acquire the GIL and execute more Python code;
=C2=A0 =C2=A0 gstate =3D PyGILState_Ensure();
=C2=A0 =C2=A0 PyRun_SimpleString("print('Thread operation completed!')")=
=
=C2=A0 =C2=A0 // Release the GIL
=C2=A0 =C2=A0 PyGILState_Release(gstate);
}
=
int main() {
=C2=A0 =C2=A0 // Initialize the Python Interpreter
=C2=A0 =C2=A0 Py_Initialize();
=
=C2=A0 =C2=A0 // Create a vector of threads
=C2=A0 =C2=A0 std::vector<std::thread> threads;
=
=C2=A0 =C2=A0 // Launch threadsn));
=C2=A0 =C2=A0 for (int i =3D 0; i < 5; ++i) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 threads.push_back(std::thread(thread_functio=
=C2=A0 =C2=A0 }
=
=C2=A0 =C2=A0 // Join threads
=C2=A0 =C2=A0 for (auto& t : threads) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 t.join();
=C2=A0 =C2=A0 }
=
=C2=A0 =C2=A0 // Finalize the Python Interpreter
=C2=A0 =C2=A0 Py_Finalize();
=
=C2=A0 =C2=A0 return 0;
}
=
=
=
Tomas Ukkonen-----------------------9e29034e00ea96b7d10a477458ea4ed4--
Hi
There was a bug in the example code. I fixed it and it STILL deadlocks (my larger software project deadlocks when I call python from C++).
Updated code:
/*˙* This code deadlocks on python3-dev 3.12.3 (ubuntu 24.04 lts)
˙*
˙* g++ python_thread_test.cpp `python3-config --cflags --libs --embed`
˙* ./a.out
˙*
˙* uname:
˙* Linux softice 6.8.0-36-generic SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
˙*/
#include <Python.h>
#include <thread>
#include <vector>
#include <iostream>
void thread_function() {At this point, there's only one thread (the main thread) and it owns the
˙ ˙ // Ensure this thread has the GIL
˙ ˙ PyGILState_STATE gstate = PyGILState_Ensure();
˙ ˙ // Execute some Python code
˙ ˙ PyRun_SimpleString("print('Hello from std::thread!')");
˙ ˙ // Release the GIL
˙ ˙ PyGILState_Release(gstate);
}
int main() {
˙ ˙ // Initialize the Python Interpreter
˙ ˙ Py_Initialize();
˙ ˙ // Create a vector of threads
˙ ˙ std::vector<std::thread> threads;
˙ ˙ // Launch threads
˙ ˙ for (int i = 0; i < 5; ++i) {
˙ ˙ ˙ ˙ threads.push_back(std::thread(thread_function));
˙ ˙ }
˙ ˙ // Join threads
˙ ˙ for (auto& t : threads) {
˙ ˙ ˙ ˙ t.join();
˙ ˙ }
˙ ˙ // Finalize the Python Interpreter
˙ ˙ Py_Finalize();
˙ ˙ return 0;
}
sunnuntaina 7. hein„kuuta 2024 klo 10:24 ip, Tomas Ukkonen <tomas.ukkonen@protonmail.ch> kirjoitti:
Hello
Is this python c api bug? The following C++ code (g++) deadlocks on Ubuntu Linux.
/*˙* This code deadlocks on python3-dev 3.12.3 (ubuntu 24.04 lts)
˙*
˙* g++ python_thread_test.cpp `python3-config --cflags --libs --embed`
˙* ./a.out
˙*
˙* uname:
˙* Linux softice 6.8.0-36-generic SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
˙*/
#include <Python.h>
#include <thread>
#include <vector>
#include <iostream>
void perform_long_operation() {
˙ ˙ // Simulate a long-running task
˙ ˙ std::this_thread::sleep_for(std::chrono::seconds(5));
}
void thread_function() {
˙ ˙ // Ensure this thread has the GIL
˙ ˙ PyGILState_STATE gstate = PyGILState_Ensure();
˙ ˙ // Execute some Python code
˙ ˙ PyRun_SimpleString("print('Hello from std::thread!')");
˙ ˙ // Release the GIL for long operation
˙ ˙ Py_BEGIN_ALLOW_THREADS
˙ ˙ perform_long_operation();
˙ ˙ Py_END_ALLOW_THREADS
˙ ˙ // Re-acquire the GIL and execute more Python code
˙ ˙ gstate = PyGILState_Ensure();
˙ ˙ PyRun_SimpleString("print('Thread operation completed!')");
˙ ˙ // Release the GIL
˙ ˙ PyGILState_Release(gstate);
}
int main() {
˙ ˙ // Initialize the Python Interpreter
˙ ˙ Py_Initialize();
The threads will each try to acquire and release the GIL, but it's still˙ ˙ // Create a vector of threads
˙ ˙ std::vector<std::thread> threads;
˙ ˙ // Launch threads
˙ ˙ for (int i = 0; i < 5; ++i) {
˙ ˙ ˙ ˙ threads.push_back(std::thread(thread_function));
˙ ˙ }
The main thread is waiting for the sub-threads to finish, and the˙ ˙ // Join threads
˙ ˙ for (auto& t : threads) {
˙ ˙ ˙ ˙ t.join();
˙ ˙ }
˙ ˙ // Finalize the Python Interpreter
˙ ˙ Py_Finalize();
˙ ˙ return 0;
}
On 7 Jul 2024, at 22:09, Tomas Ukkonen via Python-list <python-list@python=..org> wrote:
=20
Py_Initialize();
On 7 Jul 2024, at 23:21, Barry via Python-list =<python-list@python.org> wrote:
=20
=20
=20
On 7 Jul 2024, at 22:09, Tomas Ukkonen via Python-list = <python-list@python.org> wrote:=20
=20
Py_Initialize();
You also need to tell python to init threading.
I think you are missing more python setup code before you can use =threads.
Also i think you need to tell python that your thread wants to call =into python.
But I an not near my dev system to research this for you.
=20https://sourceforge.net/p/pysvn/code/HEAD/tree/trunk/pysvn/Extension/Sourc= e/pysvn.cpp
I have code to use python from C++ in my pysvn project.
See the code starting a line 354 in =
That saves the thread state and restores it.
Sysop: | Tetrazocine |
---|---|
Location: | Melbourne, VIC, Australia |
Users: | 4 |
Nodes: | 8 (0 / 8) |
Uptime: | 215:05:36 |
Calls: | 73 |
Calls today: | 1 |
Files: | 21,500 |
Messages: | 73,905 |