Python Gearman 从后台任务获取数据
我正在尝试使用gearman来处理后台任务,并从工作者那里获取数据进度。在文档中,我看到了两个方法:send_job_data和send_job_status,但在后台任务中,第一个方法不起作用(我在job.data_updates中没有看到数据),而job.status的状态是会变化的。
我用以下代码来测试工作者:
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()
这是客户端的代码:
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 [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
后台任务之所以叫这个名字,是因为它们允许提交任务的客户端在不被阻塞的情况下继续工作。也就是说,这些任务不会保持与客户端的通信通道,所以你不会收到任何状态更新。它们基本上就像被扔进了一个“黑洞”。如果你希望后台任务能传达进度信息,就需要有其他的方式让它和感兴趣的程序进行沟通。
如果你希望客户端能够继续运行并接收更新,但又不想因为等待这些更新而停下来,你可以使用“任务”方法,这样你可以添加多个任务,然后等待其中任何一个任务提供状态更新或完成。我不太确定纯Python的gearman接口是否有这个功能,但libgearman接口是有的。你可以在这里找到它的源代码 https://launchpad.net/gearman-interface,或者在某些版本的Ubuntu/Debian中找到python-gearman.libgearman。