6

これがばかげた質問である場合、私は謝罪し、恥ずかしそうに頭を隠しますが、:

Pythonでジョブをキューに入れるためにrqを使用しています。私はそれがこのように機能することを望みます:

  1. ジョブAが開始されます。ジョブAは、Web APIを介してデータを取得し、保存します。
  2. ジョブAが実行されます。
  3. ジョブAが完了します。
  4. Aが完了すると、ジョブBが開始されます。ジョブBは、ジョブAによって保存された各レコードをチェックし、いくつかの追加の応答データを追加します。
  5. ジョブBが完了すると、ユーザーはレポートの準備ができたことを知らせる幸せな電子メールを受け取ります。

これまでの私のコード:

redis_conn = Redis()
use_connection(redis_conn)
q = Queue('normal', connection=redis_conn) # this is terrible, I know - fixing later
w = Worker(q)
job = q.enqueue(getlinksmod.lsGet, theURL,total,domainid)
w.work()

私の最善の解決策は、2人のワーカー(1人はジョブA用、もう1人はB用)であると想定しました。ジョブBのワーカーは、ジョブAを監視し、ジョブAが完了すると、ジョブBを開始できます。

自分の命を救うために私が理解できないのは、ある労働者に別の労働者の状況を監視させる方法です。job.idを使用してジョブAからジョブIDを取得できます。w.nameでワーカー名を取得できます。しかし、私がその情報を他の労働者にどのように渡すかについては、最も霧がかかっていません。

または、私が完全に欠けているこれを行うためのはるかに簡単な方法はありますか?

4

4 に答える 4

7

2015 年 1 月更新。このプル リクエストは現在マージされており、パラメータの名前は に変更されていますdepends_on

second_job = q.enqueue(email_customer, depends_on=first_job)

古いバージョンなどを実行している人々のために、元の投稿はそのまま残されています。

RQ でジョブの依存関係を処理するために、プル リクエスト ( https://github.com/nvie/rq/pull/207 ) を送信しました。このプル リクエストがマージされると、次のことができるようになります。

def generate_report():
    pass

def email_customer():
    pass

first_job = q.enqueue(generate_report)
second_job = q.enqueue(email_customer, after=first_job)
# In the second enqueue call, job is created,
# but only moved into queue after first_job finishes

今のところ、ジョブを順次実行するラッパー関数を作成することをお勧めします。例えば:

def generate_report():
     pass

def email_customer():
    pass

def generate_report_and_email():
    generate_report()
    email_customer() # You can also enqueue this function, if you really want to

# Somewhere else
q.enqueue(generate_report_and_email)
于 2013-06-18T16:14:21.673 に答える
0

ジョブ A とジョブ B が行うことを 1 つの関数に結合し、たとえばmultiprocessing.Pool(そのmap_asyncメソッド) を使用して、さまざまなプロセスでそれを実行します。

rq には詳しくありませんmultiprocessingが、標準ライブラリの一部です。デフォルトでは、CPU のコアと同じ数のプロセスを使用しますが、私の経験では通常、これでマシンが飽和状態になります。

于 2012-08-23T22:58:08.373 に答える
0

プロジェクトに深く入り込みすぎて切り替えられない可能性がありますが、そうでない場合は、 を見てくださいTwistedhttp://twistedmatrix.com/trac/現在、API をヒットしたり、Web コンテンツをスクレイピングしたりするプロジェクトに使用しています。複数のジョブを並行して実行するだけでなく、特定のジョブを順番に整理するため、ジョブ B は「 t ジョブ A が完了するまで実行します。

試してみたい場合、これは Twisted を学習するのに最適なチュートリアルです。http://krondo.com/?page_id=1327

于 2012-08-24T13:29:48.177 に答える