Python Gearman从后台任务中获取数据

时间:2011-12-01 16:15:04

标签: python gearman python-gearman

我尝试使用带有后台任务的gearman并从worker获取数据进度。 在文档中,我看到方法: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 个答案:

答案 0 :(得分:2)

后台任务被调用,因为它们允许提交它们的客户端解除阻塞并断开连接。它们不会向客户端保持通信通道,因此您不会获得任何这些状态更新。他们基本上进入了比特桶。如果您想要后台任务来传达其进度,您需要有一些其他渠道来与感兴趣的程序进行通信。

如果您希望客户端继续运行并获取更新,但不阻止它们,您可以使用“任务”方法添加一堆任务,然后等待其中任何一个提供状态或完成。我不确定纯python gearman接口是否有这个,但是libgearman接口有。它在源代码形式https://launchpad.net/gearman-interface或某些版本的Ubuntu / Debian中以python-gearman.libgearman形式提供。