Python Gearman получает данные из фоновой задачи - PullRequest
3 голосов
/ 01 декабря 2011

Я пытаюсь использовать gearman с заданиями backgroud и получать данные прогресса от работника.В документации я вижу методы: send_job_data и send_job_status, но с фоновым первым методом не работают (я не вижу данных в job.data_updates), но изменения статуса в job.status.

Я используюэтот код для тестовых рабочих: из импорта gearman GearmanWorker время импорта

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()

и этот код из клиента: из импорта gearman 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}

Как яЯ могу нормально получить эти данные? Потому что моя фоновая задача будет работать несколько часов и отправлять информацию о нашем статусе в сообщениях.

1 Ответ

2 голосов
/ 02 декабря 2011

фоновые задачи называются таковыми, потому что они позволяют клиенту, который их отправил, разблокировать и отключить работу. Они не поддерживают канал связи открытым для клиента, поэтому вы не получите ни одного из этих обновлений статуса. По сути, они входят в ведро с битами. Если вы хотите, чтобы фоновая задача сообщала о ее ходе, вам нужен какой-то другой канал для связи с заинтересованными программами.

Если вы хотите, чтобы клиент продолжал работать и получать обновления, но не блокировать их, вы можете использовать метод «задача», где вы добавляете несколько задач, а затем ждете, пока какая-либо из них предоставит статус или будет завершена , Я не уверен, что это есть в интерфейсе чистого механизма python, но интерфейс libgearman есть. Он доступен в виде исходного кода здесь https://launchpad.net/gearman-interface или в некоторых версиях Ubuntu / Debian как python-gearman.libgearman.

...