我正在尝试使用python-gearman库here运行一个齿轮手的基本示例。我正在运行python 2.7.3
工人:
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'>
任何帮助将不胜感激!
感谢。
答案 0 :(得分:3)
reversed()
返回一个迭代器,而不是字节串。改为使用负步幅切片技巧:
return gearman_job.data[::-1]
这将返回一个反向字符串。
比较
>>> reversed('somedata')
<reversed object at 0x100480e50>
>>> 'somedata'[::-1]
'atademos'
答案 1 :(得分:0)
为了遇到类似错误的其他人,您需要从worker返回一个字符串。如果您没有显式返回或返回任何其他类型的数据,scrapy会抛出错误。原理很简单,Gearman的协议是基于文本的。