1

プログラム 1 は、いくつかのジョブをテーブル job_table に挿入します。

プログラム 2 は次のことを行う必要があります。

1. get the job from the table
2. handle the job
   -> this needs to be multi-threaded (because each job involves urllib waiting time, which should run in parallel)
3. insert the results into my_other_table, commiting the result

これを実装するための良い(標準的な?)方法はありますか?問題は、1 つのスレッド内でコミットすると、他のスレッドもコミットされることです。

4

4 に答える 4

0

これは、ある種の Web クローリングを行う場合によくあるタスクです。ジョブを取得し、http 応答を待ってから、応答をデータベース テーブルに書き込む単一のスレッドを実装しました。

私の方法で遭遇した問題は、複数のスレッドが同じタスクを取得しようとしないようにするために、ジョブを取得しているテーブルをロックし、それらを進行中または完了としてマークする必要があることです。

Python で threading.Thread を使用し、run メソッドをオーバーライドしました。

スレッドごとに 1 つのデータベース接続を使用します。(Python の一部の db ライブラリはスレッドセーフではありません)

于 2013-07-15T14:58:52.810 に答える
0

X 個のスレッドが実行されていて、jobs テーブルから定期的に読み取りを行っている場合、MySQL が並行処理を実行します。または、さらに保証が必要な場合は、次の利用可能なエントリを読み取る前に、いつでも自分で jobs テーブルをロックできます。こうすることで、1 つのジョブが 1 回だけ処理されることを 100% 確信できます。

@Martinが言ったように、すべてのスレッドで接続を分離してください。同じ資格情報を使用できます。

要するに:

  1. プログラム 1 -> ジョブに挿入
  2. プログラム 2 -> ジョブ テーブルに書き込みロックを作成し、他の誰も読み取れないようにする
  3. プログラム 2 -> 次の使用可能なジョブを読み取る
  4. プログラム 2 -> テーブルのロックを解除
  5. 他のすべてを通常どおり実行します。MySQL が同時実行を処理します
于 2013-07-15T15:00:37.100 に答える
0

おそらく起こることは、2 つのスレッド間で MySQL 接続を共有することです。各スレッド内で新しい MySQL 接続を作成してみてください。

プログラム 2 については、http://www.celeryproject.org/ をご覧ください:)

于 2013-07-15T14:51:48.970 に答える