3

バックグラウンドタスクでギアマンを使用して、ワーカーからデータの進行状況を取得しようとしています。ドキュメントでは、send_job_data と send_job_status というメソッドが表示されていますが、バックグラウンドで最初のメソッドが機能しません (job.data_updates にデータが表示されません) が、job.status でステータスが変更されます。

私はテスト ワーカーにこのコードを使用しています: from gearman import GearmanWorker import time

worker = GearmanWorker(['192.168.1.79:4730'])

def long_task(work, job):
  work.send_job_data(job, 'long task')
  work.send_job_status(job, 0, 3)
  time.sleep(60)
  work.send_job_data(job, 'long task2')
  work.send_job_status(job, 1,3)
  time.sleep(120)
  work.send_job_status(job,3,3)
  return "COMPLETE ALL"

worker.register_task('pool', long_task)
worker.work()

クライアントからのこのコード: from gearman import GearmanClient client = GearmanClient(['192.168.1.79:4730'])

このコード (ブロッキング) は正常に動作します。

In [6]: pool = client.submit_job('pool', '')
In [7]: pool.result
Out[7]: 'COMPLETE ALL'
In [8]: pool.data_updates
Out[8]: deque(['long task', 'long task2'])
In [9]: pool.status
Out[9]: 
{'denominator': 3,
 'handle': 'H:dhcp94:22',
 'known': True,
 'numerator': 3,
 'running': True,
 'time_received': 1322755490.691739}

そして、このクライアントは正常に動作しません(タスクのステータスを更新せず、データ/結果を取得しません):(

In [10]: pool = client.submit_job('pool', '', background=True)
In [11]: pool = client.get_job_status(pool)
In [12]: pool.status
Out[12]: 
{'denominator': 3,
 'handle': 'H:dhcp94:23',
 'known': True,
 'numerator': 0,
 'running': True,
 'time_received': 1322755604.695123}
In [13]: pool.data_updates
Out[13]: deque([])

In [14]: pool = client.get_job_status(pool)
In [15]: pool.data_updates
Out[15]: deque([])
In [16]: pool.status
Out[16]: 
{'denominator': 0,
 'handle': 'H:dhcp94:23',
 'known': False,
 'numerator': 0,
 'running': False,
 'time_received': 1322755863.306605}

どうすればこのデータを正常に取得できますか? 私のバックグラウンド タスクは数時間動作し、メッセージでステータスに関する情報を送信するためです。

4

1 に答える 1

2

バックグラウンド タスクは、バックグラウンド タスクを送信したクライアントがブロックを解除し、切断された状態で作業できるようにするため、このように呼ばれます。彼らはクライアントにコミュニケーションのチャネルを開いたままにしないので、それらのステータスの更新を取得することはありません. それらは基本的にビットバケットに入ります。バックグラウンド タスクがその進行状況を通信できるようにする場合は、関連するプログラムと通信するための別のチャネルが必要です。

クライアントを実行し続けて更新を取得するが、それらをブロックしないようにする場合は、「タスク」メソッドを使用して一連のタスクを追加し、それらのいずれかがステータスを提供するか完了するのを待ちます。純粋な python の Gearman インターフェイスにこれがあるかどうかはわかりませんが、libgearman インターフェイスにはあります。ここのソース形式で入手できますhttps://launchpad.net/gearman-interfaceまたは、Ubuntu/Debian の一部のバージョンでは python-gearman.libgearman として入手できます。

于 2011-12-01T22:24:43.537 に答える