[Python-Dev] thread issues when embedding Python

Antoine Pitrou solipsis at pitrou.net
Wed Dec 18 16:25:43 CET 2013


On Wed, 18 Dec 2013 00:19:23 +0100
Daniel Pocock <daniel at pocock.com.au> wrote:
> 
> If a main thread does things like importing a module and obtaining a
> reference to a Python method, can those things be used by other C++
> threads or do they have to repeat those lookups?

The C++ threads must use the PyGILState API to initialize corresponding
Python thread states, and to hold the GIL.

However, you don't have to *repeat* the lookups - pointers valid in
one thread are valid in other threads, as long as you own a strong
reference to the PyObject (beware functions which return a borrowed
reference).

> Is there any logic that needs to be executed once only as each thread is
> started? (the doc suggests just PyGILState_Ensure/PyGILState_Release
> each time a thread accesses Python methods - is there anything else?)

If you use the PyGILState API, there shouldn't be anything else.

> (e.g. should users always
> explicitly call PyEval_InitThreads() in their main thread or worker
> threads or both?)

You only need to call PyEval_InitThreads() once in the main Python
thread.

Regards

Antoine.




More information about the Python-Dev mailing list