2

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

スレッドが並行処理を行うことは理解できたと思いましたが、何かがおかしいです。アイデアはありますか、それとも他の Perl マジックを行う必要がありますか?

4

3 に答える 3

4

いくつかの考えられる説明:

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

  2. 手順1〜6に関連して、同時に実行できないトランザクションまたはロックはありますか?

  3. データベースへの複数の接続を使用していて、スレッド間で1つの接続を共有していないことを確認しますか?

于 2008-09-17T19:20:23.187 に答える
2

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

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

その他の可能性:

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

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

于 2008-09-17T18:45:16.640 に答える
1

データベースの設定を確認してください。保守的な方法で設定されていることがわかります。これにより、わずかな読み取りでも、その情報へのすべてのアクセスがブロックされます。

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

于 2008-09-18T04:02:25.617 に答える