0

私は websockets から始めていますが、数のライブラリと構成オプションに非常に混乱しています。node.js サーバーが python/django のメソッドを呼び出すプロジェクトをセットアップしたいだけで、最後のメソッドが終了すると、結果が node.js サーバーに転送されます。これは私がこれまでに持っているものです:

このチュートリアルの Nodes.js AMQP :

var conn = amqp.createConnection();
conn.on('ready', function(){
 var exchange = conn.exchange('?1', {'type': 'fanout', durable: false}, function() {
     exchange.publish('?2', {add: [1,2]});
 });
});

このチュートリアルの Django Celery :

from celery.decorators import task

@task()
def add(x, y):
   return x + y

これが進むべき道かどうかはわかりません。誰かがこの問題に光を当てることができれば幸いです。

---編集

AMQP を使用して単純な文字列転送を行うことに成功しました。

test.py

 import pika
 connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
 channel = connection.channel()

 channel.queue_declare(queue='task_queue', durable=True)

 print ' [*] Waiting for messages. To exit press CTRL+C'

 def callback(ch, method, props, body):
     print " [x] Received %r" % (body,)
     response = body + " MODIFIED"
     #response = get_a_concept()
     print " [x] Done"
     ch.basic_publish(exchange='',
                 routing_key=props.reply_to,
                 properties=pika.BasicProperties(correlation_id = \
                                                 props.correlation_id),
                 body=str(response))
     ch.basic_ack(delivery_tag = method.delivery_tag)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback,
                  queue='task_queue')

channel.start_consuming()

app.js

 var connection = amqp.createConnection({ host: 'localhost' });
 connection.addListener('ready', function() {


var exchange = connection.exchange('', {
    'type' : 'direct',
    durable : false
}, function() {

    var queue = connection.queue('incoming', {
        durable : false,
        exclusive : true }, function() {
        queue.subscribe(function(msg) {
            console.log("received message: ");
            console.log(msg.data.toString());
        });

    });

    exchange.publish('task_queue', "it works!", {
        'replyTo' : 'incoming'
    });
});

});


それでも、これが最適な実装かどうかはわかりません。ここでは queue.bind() メソッドを使用していません。複雑なオブジェクト (json または単純な配列) を渡そうとすると、問題が発生します。この行を変更する

 body= (["a","b","c"])#str(response)) 

次のエラーが発生します。

 Traceback (most recent call last):
   File "test.py", line 56, in <module>
     channel.start_consuming()
   File "/Library/Python/2.7/site-packages/pika/adapters/blocking_connection.py", line 293, in      start_consuming
 (...)
   File "/Library/Python/2.7/site-packages/pika/simplebuffer.py", line 62, in write
     self.buf.write(data)
 TypeError: must be string or read-only character buffer, not list

複雑なオブジェクトをシリアル化するための解決策はありますか? 何か不足していますか?

4

1 に答える 1

0

本体はバイト配列でなければなりません!

オブジェクトをバイナリシリアル化する必要があります。しかし、nods.jss と pythons は互換性がない可能性があります。

python: pickle node.js:のリュックサック...

簡単な回避策は、次のように配列を文字列に結合することです。

test.py

...
body = ';'.join(["a","b","c"]) # which will result in this string 'a;b;c'
...

app.jsでその文字列を配列に分割します。

...
result = stringResult.split(';'); //stringResult is 'a;b;c'
...

別のオプションは、 「async」を使用してnode.jsでその非同期タスクを実行することです

于 2012-08-14T07:09:31.040 に答える