2016-12-30 9 views
0
  • こんにちは私はKlein私のWebサーバー用のPythonモジュールを使用しています。
  • スレッドごとに別々にリクエストを実行する必要があり、結果を返すためには が必要です。
  • しかし、Kleinは別の要求を 処理する単一の要求が完了するまで待機します。
  • また、ねじれたモジュールからdeferToThreadを使用して試しました。また、 は、最初の要求の完了後にのみ要求を処理します。
  • 同様に私は同じ結果を も生成する@inlineCallbacksメソッドを試しました。

注:このメソッドは何も返さないときに完全に機能します。 しかし、結果を返す必要があります。ここ複数のリクエストを同時に処理し、結果をKlein Module Pythonで返す

Iは、以下のサンプルコードスニペットを添付

import time 
import klein 
import requests 
from twisted.internet import threads 

def test(): 
    print "started" 
    x = requests.get("http://google.com") 
    time.sleep(10) 
    return x.text 

app = klein.Klein() 

@app.route('/square/submit',methods = ['GET']) 
def square_submit(request): 
    return threads.deferToThread(test) 

app.run('localhost', 8000) 
+0

Twistedは、複数の要求を並行して実行できる必要があります。最初に使うのはややこしいことです。たぶん、あなたのツイストコードを提供し、それを見てみましょう。さもなければ、私は 'マルチプロセッシング'や 'マルチスレッド'モジュールを調べます。私はおそらく、戻り値の通信を処理するためにキューを使用します。そのための 'queue'モジュールを見てください。 –

+0

@ TammoHeerenご回答ありがとうございます。キューモジュールを使用するための参照リンクについて言及してください。 –

答えて

0

しかし、クラインは、別の要求を処理する単一の要求が完了するまで待機します。

これは当てはまりません。実際、提供したコードには何も問題はありません。私はあなたには、Webブラウザでコードをテストしていると仮定して修正

curl http://localhost:8000/square/submit & # run in background 
curl http://localhost:8000/square/submit 

アム:単純tcp:localhost:8000であなたの例のサーバーを実行すると、次のcurlのコマンドを使用して、あなたの主張を無効に?もしあなたがそうであれば、あなたは最新のブラウザの "機能"を体験しています。ブラウザは指定された時間にURLごとに1回のリクエストを行います。

http://localhost:8000/squre/submit 
http://localhost:8000/squre/submit?bogus=0 
http://localhost:8000/squre/submit?bogus=1 
http://localhost:8000/squre/submit?bogus=2 

しかし、新しいツイスト/クラインの開発者が作成する傾向が非常に一般的な間違いは、ブロッキング書くことである。これを回避する一つの方法は、ブラウザでそのように、URLの末尾に偽のクエリ文字列を追加することですTwistedは魔法のように非同期になると考えています。例:

@app.route('/square/submit') 
def square_submit(): 
    print("started") 
    x = requests.get('https://google.com') # blocks the reactor 
    time.sleep(5) # blocks the reactor 
    return x.text 

このようなコードは、要求を順番に処理し、非同期の代替方法で変更する必要があります。

+0

お返事ありがとうございます。私はいくつかの非同期の代替案を探します。 –

+0

あなたは '' request''を['' treq''](https://treq.readthedocs.io/en/latest/)に置き換えることができます。あなたは '' task.deferLater() ''や ' 'react.callLater()' 'を実行して' 'time.sleep''を真似します。 –

関連する問題