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

注: このメソッドは、返すものが何もない場合に完全に機能します。しかし、私は結果を返す必要があります。

以下にサンプルコードスニペットを添付します。

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)
4

2 に答える 2

0

しかし、Klein は別の要求を処理するために単一の要求が完了するまで待ちます。

本当じゃない。実際、あなたが提供したコードにはまったく問題はありません。tcp:localhost:8000次のコマンドを使用してサンプル サーバーを実行するだけでcurl、主張が無効になります。

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

Web ブラウザーでコードをテストしていると仮定して正しいですか? もしそうなら、あなたはほとんどの最新ブラウザの「機能」を経験しています。ブラウザーは、特定の時間に URL ごとに 1 つの要求を行います。ブラウザーでこれを回避する 1 つの方法は、次のように、URL の末尾に偽のクエリ文字列を追加することです。

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

しかし、新しい Twisted/Klein 開発者が犯しがちな非常によくある間違いは、ブロック コードを記述して、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

このようなコードはリクエストを順次処理するため、非同期の代替手段で変更する必要があります。

于 2016-12-31T07:55:44.703 に答える