質問

Perl スレッド (スレッドを使用) を使用してセットアップしようとしている Perl スクリプトがあります。単純なテストを実行するとすべてが機能しますが、実際のスクリプトを実行すると(複数のSQLを実行するスレッドが含まれます)プラスセッション)、各 SQLPlus セッションは順番に実行されます (つまり、スレッド 1 の sqlplus がステップ 1 ~ 5 を実行し、次にスレッド 2 の sqlplus がステップ 6 ~ 11 を実行するなど)。

スレッドが同時処理を行うことは理解したつもりでしたが、何かが間違っています。何かアイデアはありますか、それとも他の Perl マジックを実行する必要がありますか?

役に立ちましたか?

解決

考えられる説明はいくつかあります:

  1. このスクリプトをマルチコア プロセッサまたはマルチプロセッサ マシンで実行していますか?CPU が 1 つしかない場合、それを使用できるスレッドは常に 1 つだけです。

  2. ステップ 1 ~ 6 に、同時実行を妨げるトランザクションまたはロックが関係していますか?

  3. データベースへの複数の接続を使用しており、スレッド間で 1 つの接続を共有していませんか?

他のヒント

実際には、スレッドがどの順序で実行されるかを保証する方法はありません。したがって、この動作は (期待どおりではないとしても) 実際には間違っていません。

ここで何らかの同期が行われているのではないかと思います。おそらく SQL*Plus 自体を 1 回だけ呼び出すことができますか?一部のプログラムはそれを行います...

その他の可能性:

  • スレッドの作成とプロセスの作成 (あなたは SQL*Plus のサブプロセスの作成にはスレッドの実行より時間がかかるため、スレッド 2 が開始される前にスレッド 1 が終了します。

  • SQL スクリプトでデータベース更新の同期を強制するトランザクションを使用しています。

データベースの設定を確認してください。保守的な方法で設定されていることがわかるかもしれません。その場合、たとえ軽微な読み取りであっても、その情報へのすべてのアクセスがブロックされてしまいます。

電話する必要がある場合もあります threads::yield.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top