pybind11を使用したマルチスレッドC ++プログラムへのPythonインタープリターの埋め込み

ババザ

サードパーティのC ++ライブラリにPythonメソッドを呼び出させるために、pybind11を使用しようとしていますライブラリはマルチスレッド化されており、各スレッドはPythonオブジェクトを作成してから、オブジェクトのメソッドを多数呼び出します。

私の問題は、py::gil_scoped_acquire acquire;デッドロックの呼び出しです。問題を再現する最小限のコードを以下に示します。私は何が間違っているのですか?

// main.cpp
class Wrapper
{
public:
  Wrapper()
  {
    py::gil_scoped_acquire acquire;
    auto obj = py::module::import("main").attr("PythonClass")();
    _get_x = obj.attr("get_x");
    _set_x = obj.attr("set_x");
  }
  
  int get_x() 
  {
    py::gil_scoped_acquire acquire;
    return _get_x().cast<int>();
  }

  void set_x(int x)
  {
    py::gil_scoped_acquire acquire;
    _set_x(x);
  }

private:
  py::object _get_x;
  py::object _set_x;
};


void thread_func()
{
  Wrapper w;

  for (int i = 0; i < 10; i++)
  {
    w.set_x(i);
    std::cout << "thread: " << std::this_thread::get_id() << " w.get_x(): " << w.get_x() << std::endl;
    std::this_thread::sleep_for(100ms);    
  }
}

int main() {
  py::scoped_interpreter python;
  
  std::vector<std::thread> threads;

  for (int i = 0; i < 5; ++i)
    threads.push_back(std::thread(thread_func));

  for (auto& t : threads)
    t.join();

  return 0;
}

およびPythonコード:

// main.py
class PythonClass:
    def __init__(self):
        self._x = 0

    def get_x(self):
        return self._x

    def set_x(self, x):
        self._x = x

関連する質問はここここありますが、問題の解決には役立ちませんでした。

ババザ

ワーカースレッドを開始する前に、メインスレッドでGILを解放することで、問題を解決することができました(追加py::gil_scoped_release release;)。興味のある人のために、以下が機能するようになりました(Pythonオブジェクトのクリーンアップも追加されました)。

#include <pybind11/embed.h>  
#include <iostream>
#include <thread>
#include <chrono>
#include <sstream>

namespace py = pybind11;
using namespace std::chrono_literals;

class Wrapper
{
public:
  Wrapper()
  {
    py::gil_scoped_acquire acquire;
    _obj = py::module::import("main").attr("PythonClass")();
    _get_x = _obj.attr("get_x");
    _set_x = _obj.attr("set_x");

  }
  
  ~Wrapper()
  {
    _get_x.release();
    _set_x.release();
  }

  int get_x() 
  {
    py::gil_scoped_acquire acquire;
    return _get_x().cast<int>();
  }

  void set_x(int x)
  {
    py::gil_scoped_acquire acquire;
    _set_x(x);
  }

private:
  py::object _obj;
  py::object _get_x;
  py::object _set_x;
};


void thread_func(int iteration)
{
  Wrapper w;

  for (int i = 0; i < 10; i++)
  {
    w.set_x(i);
    std::stringstream msg;
    msg << "iteration: " << iteration << " thread: " << std::this_thread::get_id() << " w.get_x(): " << w.get_x() << std::endl;
    std::cout << msg.str();
    std::this_thread::sleep_for(100ms);    
  }
}

int main() {
  py::scoped_interpreter python;
  py::gil_scoped_release release; // add this to release the GIL

  std::vector<std::thread> threads;
  
  for (int i = 0; i < 5; ++i)
    threads.push_back(std::thread(thread_func, 1));

  for (auto& t : threads)
    t.join();

  return 0;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

pybind11を使用して、既存の埋め込みPythonインタープリターでC ++機能を公開する

分類Dev

PythonインタープリターとPythonアプリのソースコードをコンパイル済みプログラムに埋め込むことはできますか?

分類Dev

Pythonインタープリター(pybind11)が埋め込まれたCPPファイルをビルドして実行する方法

分類Dev

カスタムCordovaプラグイン:「埋め込みバイナリ」にフレームワークを追加

分類Dev

センサーを使用したラズベリーパイのマルチスレッドプログラムのリファクタリング

分類Dev

プログラムによるJava h2データベースの埋め込み

分類Dev

コンパイル済みのアプリケーションをCの別のプログラムに埋め込む

分類Dev

ディープラーニングでの埋め込み/埋め込みレイヤーの使用

分類Dev

埋め込みPython:複数のサブインタープリターが機能しない

分類Dev

pybind11を使用してC ++スレッド内のコールバックとしてPython関数を呼び出す方法

分類Dev

埋め込むためのトップレベルのプログラムを必要とせずに、C ++ライブラリからJavaコードを埋め込みますか?

分類Dev

既存のExcelスプレッドシートへのプログラムによる差し込みスタイルのデータ挿入?

分類Dev

Neo4j埋め込み:グラフアルゴリズムを使用してノードプロパティをフィルタリング

分類Dev

埋め込みリソースを使用したServiceStackテンプレートのオーバーライド

分類Dev

macOSデスクトップアプリケーション(Xcodeプロジェクト)へのRacket静的ライブラリの埋め込み

分類Dev

CアプリケーションへのPythonの埋め込み

分類Dev

keras(ディープラーニングライブラリ)で、カスタム埋め込みレイヤーをsushすることは可能ですか?

分類Dev

C ++プログラムにデータを埋め込む

分類Dev

C ++プログラムにデータを埋め込む

分類Dev

パンダデータフレームへのマルチプロセッシング書き込み

分類Dev

Pythonでゼロ以外の埋め込みタイムスタンプを解析する

分類Dev

Keras 2でカスタム(なし)損失のあるトリプレット埋め込みレイヤー

分類Dev

タイムスタンプ付きのdiscord.py埋め込みフッター

分類Dev

ファイルユーザーデータへのC#プログラミング書き込み

分類Dev

スタンドアロンのボケグラフをdjangoテンプレートに埋め込む方法

分類Dev

GuavaFutureCallbackインターフェースを使用したJavaマルチスレッドプログラミング

分類Dev

Cの別のプログラムのポインタにデータを書き込みますか?

分類Dev

Cプログラミング:データの読み込み

分類Dev

Mongoid埋め込みドキュメントのタイムスタンプ

Related 関連記事

  1. 1

    pybind11を使用して、既存の埋め込みPythonインタープリターでC ++機能を公開する

  2. 2

    PythonインタープリターとPythonアプリのソースコードをコンパイル済みプログラムに埋め込むことはできますか?

  3. 3

    Pythonインタープリター(pybind11)が埋め込まれたCPPファイルをビルドして実行する方法

  4. 4

    カスタムCordovaプラグイン:「埋め込みバイナリ」にフレームワークを追加

  5. 5

    センサーを使用したラズベリーパイのマルチスレッドプログラムのリファクタリング

  6. 6

    プログラムによるJava h2データベースの埋め込み

  7. 7

    コンパイル済みのアプリケーションをCの別のプログラムに埋め込む

  8. 8

    ディープラーニングでの埋め込み/埋め込みレイヤーの使用

  9. 9

    埋め込みPython:複数のサブインタープリターが機能しない

  10. 10

    pybind11を使用してC ++スレッド内のコールバックとしてPython関数を呼び出す方法

  11. 11

    埋め込むためのトップレベルのプログラムを必要とせずに、C ++ライブラリからJavaコードを埋め込みますか?

  12. 12

    既存のExcelスプレッドシートへのプログラムによる差し込みスタイルのデータ挿入?

  13. 13

    Neo4j埋め込み:グラフアルゴリズムを使用してノードプロパティをフィルタリング

  14. 14

    埋め込みリソースを使用したServiceStackテンプレートのオーバーライド

  15. 15

    macOSデスクトップアプリケーション(Xcodeプロジェクト)へのRacket静的ライブラリの埋め込み

  16. 16

    CアプリケーションへのPythonの埋め込み

  17. 17

    keras(ディープラーニングライブラリ)で、カスタム埋め込みレイヤーをsushすることは可能ですか?

  18. 18

    C ++プログラムにデータを埋め込む

  19. 19

    C ++プログラムにデータを埋め込む

  20. 20

    パンダデータフレームへのマルチプロセッシング書き込み

  21. 21

    Pythonでゼロ以外の埋め込みタイムスタンプを解析する

  22. 22

    Keras 2でカスタム(なし)損失のあるトリプレット埋め込みレイヤー

  23. 23

    タイムスタンプ付きのdiscord.py埋め込みフッター

  24. 24

    ファイルユーザーデータへのC#プログラミング書き込み

  25. 25

    スタンドアロンのボケグラフをdjangoテンプレートに埋め込む方法

  26. 26

    GuavaFutureCallbackインターフェースを使用したJavaマルチスレッドプログラミング

  27. 27

    Cの別のプログラムのポインタにデータを書き込みますか?

  28. 28

    Cプログラミング:データの読み込み

  29. 29

    Mongoid埋め込みドキュメントのタイムスタンプ

ホットタグ

アーカイブ