PyGILState_Ensure() Causing Deadlock

后端 未结 3 2122
無奈伤痛
無奈伤痛 2021-02-14 18:55

I\'m writing a Python extension in C++, wrapping a third-party library I do not control. That library creates a thread Python knows nothing about, and from that thread, calls a

3条回答
  •  情深已故
    2021-02-14 19:30

    This answer is only for Python >= 3.0.0. I don't know if it would work for earlier Pythons or not.

    Wrap your C++ module in a Python module that looks something like this:

    import threading
    t = threading.Thread(target=lambda: None, daemon=True)
    t.run()
    del t
    from your_cpp_module import *
    

    From my reading of the documentation, that should force threading to be initialized before your module is imported. Then the callback function you have written up there should work.

    I'm less confident of this working, but your module init function could instead do this:

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

    that should work because your module init function should be being executed by the only Python thread in existence if PyEval_ThreadsInitialized() isn't true, and holding the GIL is the right thing to do then.

    These are guesses on my part. I've never done anything like this as is evidenced by my clueless comments on your question. But from my reading of the documentation, both of these approaches should work.

提交回复
热议问题