Python RQ 排队 JavaScript
Python RQ queueing with JavaScript
我正在尝试使用 JavaScript 为 Python RQ 排队任务。为此,我只监控了 RQ 对 Redis 的处理。特别是它存储了一个 pickled 列表,指示在哪里可以找到 运行 的任务,包括输入参数等。这里我使用的是在 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_redis。
我自己发现的。 Python 的 pickle 输出字符串实际上是二进制的,这是 Python 中写入和读取文件的常用方式。 Javascript 不喜欢,"fixes" 喜欢。解决方案是Javascript的缓冲区。
> new Buffer('\x80\x85', 'binary')
<Buffer 80 85>
而
> new Buffer('\x80\x85')
<Buffer c2 80 c2 85>
只需提供 node_redis 缓冲区对象,序列化对象的 "correct" 表示将出现在 redis 中,并且 rqworker 将按预期工作。请记住,'binary' 模式正在被弃用。
我正在尝试使用 JavaScript 为 Python RQ 排队任务。为此,我只监控了 RQ 对 Redis 的处理。特别是它存储了一个 pickled 列表,指示在哪里可以找到 运行 的任务,包括输入参数等。这里我使用的是在 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_redis。
我自己发现的。 Python 的 pickle 输出字符串实际上是二进制的,这是 Python 中写入和读取文件的常用方式。 Javascript 不喜欢,"fixes" 喜欢。解决方案是Javascript的缓冲区。
> new Buffer('\x80\x85', 'binary')
<Buffer 80 85>
而
> new Buffer('\x80\x85')
<Buffer c2 80 c2 85>
只需提供 node_redis 缓冲区对象,序列化对象的 "correct" 表示将出现在 redis 中,并且 rqworker 将按预期工作。请记住,'binary' 模式正在被弃用。