Ошибка при запуске базового примера python-gearman

Я пытаюсь запустить базовый пример gearman, используя библиотеку python-gearman, доступную здесь. Я бегу питон 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

Я получаю следующую ошибку (полная трассировка доступна здесь)

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'>

Любая помощь будет оценена!

Благодарю.

2 ответа

Решение

reversed() возвращает итератор, а не строку байтов. Вместо этого используйте трюк с отрицательным шагом:

return gearman_job.data[::-1]

Это возвращает обратную строку вместо этого.

Для сравнения:

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

Ради других людей, сталкивающихся с подобными ошибками, вам нужно вернуть строку из работника. Если вы не вернете явно или не вернете данные любого другого типа, scrapy выдает ошибку. Причина проста: протокол Gearman основан на тексте.

Другие вопросы по тегам