2011-12-01 25 views
3

我尝试使用背景任务的工人并从工作人员获取数据进度。 在文档中我看到的方法:send_job_data和send_job_status,但与背景第一种方法不工作(我没有看到job.data_updates中的数据),但job.status中的状态更改。Python Gearman从后台任务中获取数据

我使用此代码测试人员:从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 客户端= GearmanClient(['192.168.1.79 :4730' ])

此代码(阻塞)工作正常:

而这个客户端无法正常工作正常(没有任务更新状态,并没有得到数据/结果):(

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} 

我如何能正常得到这个数据?因为我的后台任务将工作几个小时,并在消息中发送有关我们状态的信息。

回答

2

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

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