2012-10-31 25 views
1

我試圖運行使用python-的Gearman庫提供here的Gearman的一個基本的例子。我正在運行的Python 2.7.3錯誤運行基本的Python-Gearman的例子

工人:

import gearman 

gm_worker = gearman.GearmanWorker(['localhost:4730']) 

def task_listener_reverse(gearman_worker, gearman_job): 
    print 'reporting status' 
    return reversed(gearman_job.data) 

gm_worker.set_client_id('testclient') 
gm_worker.register_task('reverse', task_listener_reverse) 
gm_worker.work() 

客戶:

import gearman 

gm_client = gearman.GearmanClient(['localhost:4730']) 
print 'Sending job...' 
request = gm_client.submit_job('reverse', 'Hello World!') 
print "Result: " + request.result 

我收到以下錯誤(完整跟蹤可用here

File "/Users/developer/gearman/connection_manager.py", line 27, in _enforce_byte_string 
    raise TypeError("Expecting byte string, got %r" % type(given_object)) 
TypeError: Expecting byte string, got <type 'reversed'> 

任何幫助將不勝感激!

謝謝。

回答

3

reversed()返回一個迭代器,而不是一個字節串。使用負步幅切片伎倆來代替:

return gearman_job.data[::-1] 

這將返回一個字符串逆轉代替。

比較:

>>> reversed('somedata') 
<reversed object at 0x100480e50> 
>>> 'somedata'[::-1] 
'atademos' 
+0

謝謝。這工作! – ducky

0

對於面臨着類似的錯誤以外的其他人着想,你需要從工人返回一個字符串。如果您沒有顯式返回或返回任何其他類型的數據,則scrapy會引發錯誤。原因很簡單,Gearman的協議是基於文本的。