【问题标题】:Calling Py_Initialize() in multiple threads在多个线程中调用 Py_Initialize()
【发布时间】:2017-10-05 21:19:36
【问题描述】:

我将 Python 嵌入到多线程 C++ 应用程序中,调用是否安全 Py_Initialize() 在多个线程中?还是应该在主线程中调用?

【问题讨论】:

标签: python c++ python-2.7 c++11 python-embedding


【解决方案1】:

Py_Initialize() 代码包含:

if (initialized)
    return;
initialized = 1;

该函数的文档还说:

第二次调用时这是一个无操作(没有先调用 Py_Finalize())。

我的建议是你只在主线程中执行它,尽管取决于你在做什么,它可能会变得复杂。

问题在于信号处理程序仅在 Python 主线程的上下文中触发。也就是说,无论哪个线程调用Py_Initialize()。因此,如果这是一个瞬态线程并且只使用一次然后被丢弃,那么就没有机会调用信号处理程序。因此,您必须考虑如何处理信号。

还要小心使用大量使用本地线程 API 在 C 代码中创建的临时线程并调用 Python 解释器,因为每个线程都会在 Python 解释器中创建数据。如果继续创建和丢弃这些外部线程,那将会累积。如果从外部线程调用,则应尽量使用线程池,并继续重用先前的线程。

【讨论】:

  • 如果Py_Initialize()在多个线程中被调用,如果一个线程正在读取这个变量initialized而另一个线程正在将它写入1,你如何保证线程安全?
  • 是的,这可能是另一个问题。在这种情况下,您需要在对 Py_Initialize() 的调用周围使用互斥锁。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2017-08-31
  • 2011-07-19
  • 2010-09-07
  • 2015-06-07
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
相关资源
最近更新 更多