2011-12-01 26 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的形式提供。