Cross-language issues¶
Multi-threading¶
Chaquopy is thread-safe. However, because it’s based on CPython (the Python reference implementation), it is limited by CPython’s global interpreter lock (GIL). This means that although Python code may be run on any number of threads, only one of those threads will be executing at any given moment.
The GIL can be a bottleneck for threads which release and acquire it many times in quick
succession (see discussion here). If your UI thread
makes many Python calls while a CPU-bound Python thread is running in the background, you may
improve responsiveness by reducing sys.setswitchinterval
from its default value of 0.005
to something lower like 0.001.
threading.main_thread
will return the thread on which Python was started. Depending on
your app’s structure, this might not be the same as the main thread in Java.
See also
The multi-threading features of the Python API.
Memory management¶
It’s possible to create a cross-language reference cycle if a Python object references a Java object which, directly or indirectly, references the original Python object. Such a cycle cannot be detected by the garbage collector in either language. To avoid a memory leak. either use a weak reference somewhere in the cycle, or break the cycle manually once it’s no longer required.