【发布时间】:2017-10-05 21:19:36
【问题描述】:
我将 Python 嵌入到多线程 C++ 应用程序中,调用是否安全
Py_Initialize() 在多个线程中?还是应该在主线程中调用?
【问题讨论】:
-
你已经问过这个问题了;尽管关注点不同。请参考我对副本的回答。
标签: python c++ python-2.7 c++11 python-embedding
我将 Python 嵌入到多线程 C++ 应用程序中,调用是否安全
Py_Initialize() 在多个线程中?还是应该在主线程中调用?
【问题讨论】:
标签: python c++ python-2.7 c++11 python-embedding
Py_Initialize() 代码包含:
if (initialized)
return;
initialized = 1;
该函数的文档还说:
第二次调用时这是一个无操作(没有先调用 Py_Finalize())。
我的建议是你只在主线程中执行它,尽管取决于你在做什么,它可能会变得复杂。
问题在于信号处理程序仅在 Python 主线程的上下文中触发。也就是说,无论哪个线程调用Py_Initialize()。因此,如果这是一个瞬态线程并且只使用一次然后被丢弃,那么就没有机会调用信号处理程序。因此,您必须考虑如何处理信号。
还要小心使用大量使用本地线程 API 在 C 代码中创建的临时线程并调用 Python 解释器,因为每个线程都会在 Python 解释器中创建数据。如果继续创建和丢弃这些外部线程,那将会累积。如果从外部线程调用,则应尽量使用线程池,并继续重用先前的线程。
【讨论】:
Py_Initialize()在多个线程中被调用,如果一个线程正在读取这个变量initialized而另一个线程正在将它写入1,你如何保证线程安全?
Py_Initialize() 的调用周围使用互斥锁。