0

boost.pythonライブラリで構築されたPython拡張機能の非常に奇妙な動作が発生しました。つまり、コードの一部で:

import my_ext

j = 0
while j<5:
    print j
    my_ext.do_something(j)
    j = j + 1

拡張コード()が別のjに対して何らかの作業を行っている間、jが印刷されているのがわかりませんmy_ext.do_something(j)(たとえば、j番目のファイルを印刷します)。さらに、j=0とj=1の場合は2つのファイルのみを出力し、スクリプト全体がエラーやその他の通知なしで終了します。

これらすべてにより、コードはちょっと並列に実行されている(マルチスレッド)と思いますが、そのような並列処理は適切に処理されていません。これは、私が構築したboost.pythonライブラリがデフォルトで--threading=multiオプションを使用して作成されているという事実に関連している可能性があります。ただし、オプション--threading = singleを使用して再構築しようとしても効果はなく、マルチスレッドライブラリとして構築されます。この投稿http://mail.python.org/pipermail/cplusplus-sig/2010-October/015771.html は、同様のビルドプロセスの問題を報告していますが、未回答です。

だから私の質問は、特にシングルスレッドになるようにブーストライブラリとboost.pythonを構築する方法です。または、boost.pythonライブラリのシングル/マルチスレッド以外の問題に関連している可能性があります。

追加情報:私はcygwin、boost_1.50.0、python2.6を使用しています、私のOSはマルチコアCPUとnvidia vramを備えたWin7です(後者のハードウェアは両方とも私に知らせずに私の拡張機能のマルチスレッド実行を好むかもしれません)。

4

1 に答える 1

1

Boost.Python は、Python がビルドされた Python のバージョンと構成に結び付けられているため、Boost ビルド システムでは特殊なケースになる傾向があります。たとえば、Python がデバッグなしでビルドされている場合、Boost がデバッグ バリアントをビルドするように明示的に指示されていても、Boost.Python はデバッグなしでビルドされます。pyconfig.hを含めることで間接的に含めるため、スレッド化プロパティについても同じことが当てはまると思いますPython.h

Python がスレッドをサポートするようにビルドされているかどうかに関係なく、Python はデフォルトで単一のスレッドでプログラムを実行します。Boost.Python はこの動作を変更しません。一般的な経験則として、スレッド化は、同時実行が必要な場合にのみ Boost.Python の要素になります。たとえばmy_ext.do_something()、大きなファイルをメモリに読み込む場合、インタプリタのロックを保持せずに読み込みを実行するのが最適な場合があります。

拡張機能の単純化された実装から始めて、それを拡張することを検討してください。たとえば、次のようにビルドするmy_extと:

#include <iostream>
#include <boost/python.hpp>

void do_something(unsigned int j)
{
  std::cout << "do_something(): " << j << std::endl;
}

BOOST_PYTHON_MODULE(my_ext)
{
  namespace python = boost::python;
  python::def("do_something", &do_something);
}

私のテストスクリプト:

import my_ext

for j in xrange(5):
    print j
    my_ext.do_something(j)

生成:

0
do_something(): 0
1
do_something(): 1
2
do_something(): 2
3
do_something(): 3
4
do_something(): 4

別の方法として、Python と Boost.Python のデバッグ バージョンをビルドしてから、デバッガーを使用してプログラムをステップ実行する方法があります。デバッグ ビルドの詳細については、こちらを参照してください。

于 2013-03-25T16:53:38.460 に答える