Python RQ使用JavaScript进行排队

时间:2015-03-31 10:46:23

标签: javascript python node.js utf-8 python-rq

我正在尝试使用JavaScript为Python RQ排队任务。为此,我只是监控RQ对Redis的作用。特别是它存储了一个腌制列表,指示在哪里找到要运行的任务,包括输入args等。这里我使用RQ主页上的示例。存储以下字符串(pickled list)时:

'\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.'

使用JavaScript,它对文字\x80\x85做了一些奇怪的事情。它用\xc2\x80\xc2\x85替换它们,我无法弄清楚为什么以及如何阻止这种行为。字符串的其余部分按预期方式进入Redis。额外的文字阻碍了rqworker,更具体地说是pickle,才能正常运行。

> encodeURI('\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.')
'%C2%80%02(X%1C%00%00%00my_module.count_words_at_urlq%01NU%0Fhttp://nvie.comq%02%C2%85q%03%7Dq%04tq%05.'

> decodeURI('\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.')
' \u0002(X\u001c\u0000\u0000\u0000my_module.count_words_at_urlq\u0001NU\u000fhttp://nvie.comq \u0002q\u0003}q\u0004tq\u0005.'

我正在使用node和node_redis。

1 个答案:

答案 0 :(得分:1)

我自己找到它。 Python的pickle输出字符串实际上是二进制文件,这是在Python中编写和读取文件的常用方法。 Javascript不喜欢它并“修复”它。解决方案是Javascript的缓冲区。

> new Buffer('\x80\x85', 'binary')
<Buffer 80 85>

,而

> new Buffer('\x80\x85')
<Buffer c2 80 c2 85>

只需将node_redis作为缓冲区对象,序列化对象的“正确”表示将出现在redis中,而rqworker将按预期工作。请记住,'二进制'模式正在被弃用。