I have a Python app that calls a C++ boost python library and it all works. However, I have a callback C++ to Python scenario where C++ from a boost thread calls python and I get an access violation on the C++ side. If I do exactly the same callback using the python thread it works perfectly. Therefore I suspect that I can not simply callback Python from C++ using a boost thread but need to do something extra for it to work?
How to call Python from a boost thread?
1.8k Views Asked by SkyWalker At
1
There are 1 best solutions below
Related Questions in PYTHON
- new thread blocks main thread
- Extracting viewCount & SubscriberCount from YouTube API V3 for a given channel, where channelID does not equal userID
- Display images on Django Template Site
- Difference between list() and dict() with generators
- How can I serialize a numpy array while preserving matrix dimensions?
- Protractor did not run properly when using browser.wait, msg: "Wait timed out after XXXms"
- Why is my program adding int as string (4+7 = 47)?
- store numpy array in mysql
- how to omit the less frequent words from a dictionary in python?
- Update a text file with ( new words+ \n ) after the words is appended into a list
- python how to write list of lists to file
- Removing URL features from tokens in NLTK
- Optimizing for Social Leaderboards
- Python : Get size of string in bytes
- What is the code of the sorted function?
Related Questions in C++
- C++ using std::vector across boundaries
- Linked list without struct
- Connecting Signal QML to C++ (Qt5)
- how to get the reference of struct soap inherited in C++ Proxy/Service class
- Why we can't assign value to pointer
- Conversion of objects in c++
- shared_ptr: "is not a type" error
- C++ template using pointer and non pointer arguments in a QVector
- C++ SFML 2.2 vectors
- Lifetime of temporary objects
- I want to be able to use 4 different variables in a select statement in c ++
- segmentation fault: 11, extracting data in vector
- How to catch delay-import dll errors (missing dll or symbol) in MinGW(-w64)?
- How can I print all the values in this linked list inside a hash table?
- Configured TTL for A record(s) backing CNAME records
Related Questions in MULTITHREADING
- new thread blocks main thread
- WPF MessageBox Cancel checkbox check
- How to avoid concurrent access to a resource?
- run oncomplete event in async
- Threading Segfault when reading members
- Function timeouts in C and thread
- How are multiple requests to Task.Run handled from a resource management standpoint?
- Acumatica perfomance with threads
- Wait and Notify in Java threads for a given interval
- Different behavior of async with Visual Studio 2013(Windows8.1) and GCC 4.9(Ubuntu14.10)
- How to return blocking queue to the right object?
- background thread using Task.Run
- deletion and cleanup of worker thread in Qt crashes
- Pipeline-like operation using TChan
- implementing in app purchase on android
Related Questions in BOOST-PYTHON
- Python thread memory layout (in combination with boost::python)
- Boost.Python did not match signature lvalue
- Passing shared_ptr to another python module
- Boost Python: Fails to call a C++ virtual function, which is overridden in a Python derived class
- brew link boost to homebrew python
- Is it possible to create instance in C++ program of a class defined in Python module?
- Py_InitModule with multiple functions - invalid conversion from int to PyCFunction
- boost.python c++ multithreading
- How to call Python from a boost thread?
- How can I start a Python thread FROM C++?
- How to prevent Python from throwing back to C++ boost::python::error_already_set?
- How to use class across modules with boost.python?
- Creat list of list in the boost python
- Extract and convert list element of boost::python::list
- boost python: tie lifetime of argument to returned value using return_internal_reference
Related Questions in BOOST-THREAD
- Boost Bind to Method
- The conditional variable is not working but after adding std::cout, it is working
- How to iterate through boost thread specific pointers
- boost does not accept anonymous functions as input for anything
- C++ Boost thread attributes set_stack_size
- Boost w/ C++ - Curious mutex behavior
- How to call Python from a boost thread?
- c++ boost threading issue
- Boost thread overrides value of member variables
- Using WaitForSingleObject on Windows but supporting boost thread interrupts
- Boost Thread segmentation fault on join()
- Mutex-managed threads processed in "chunks" instead of interlacing
- Boost Thread defer thread creation
- How to wait for a thread till it has started running
- Type of boost::future<> from boost::async()
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
The most likely culprit is that the Global Interpreter Lock (GIL) is not being held by a thread when it is invoking Python code, resulting in undefined behavior. Verify all paths that make direct or indirect Python calls, acquire the GIL before invoking Python code.
The GIL is a mutex around the CPython interpreter. This mutex prevents parallel operations to be performed on Python objects. Thus, at any point in time, a max of one thread, the one that has acquired the GIL, is allowed to perform operations on Python objects. When multiple threads are present, invoking Python code whilst not holding the GIL results in undefined behavior.
C or C++ threads are sometimes referred to as alien threads in the Python documentation. The Python interpreter has no ability to control the alien thread. Therefore, alien threads are responsible for managing the GIL to permit concurrent or parallel execution with Python threads. One must meticulously consider:
One solution is to wrap Python callbacks with a custom type that is aware of GIL management.
Using a RAII-style class to manage the GIL provides an elegant exception-safe solution. For example, with the following
with_gilclass, when awith_gilobject is created, the calling thread acquires the GIL. When thewith_gilobject is destructed, it restores the GIL state.And its usage:
With being able to manage the GIL via
with_gil, the next step is to create a functor that properly manages the GIL. The followingpy_callableclass will wrap aboost::python::objectand acquire the GIL for all paths in which Python code is invoked:By managing the
boost::python::objecton the free-space, one can freely copy theshared_ptrwithout having to hold the GIL. This allows for us to safely use the default generated copy-constructor, assignment operator, destructor, etc.One would use the
py_callableas follows:Here is a complete example demonstrating having a Python extension invoke a Python object as a callback from a C++ thread:
Interactive usage: