2017-02-18 12 views
0

私はthisと同様のスレッドcgiウェブサーバを作ろうとしています。しかし、私は別のスレッドのためのハンドラのローカルデータを設定する方法に固執しています。ハンドラ以外のスレッドに対して、のデータ(dictなど)を設定することは可能ですか?より具体的には、私は、subprocess.runで始まったcgiファイルからリクエストパラメータ、ヘッダなどを取得したいと考えています。 do_GETの末尾にthis file on githubがありますが、これは一度に1つのクライアントにしか対応できません。一度に複数の接続/スレッドが必要なので、この部分を置き換えたいですし、各接続/スレッドで異なるデータが必要です。threading.localは別のスレッドから

threading.localデータを別のスレッドから編集/設定する方法はありますか?もし私がしようとしていることを達成するより良い方法があれば、私に教えてください。これが間違いなく不可能であることが分かっている場合は、そう言います。

ありがとうございます!

答えて

1

あなたが持っているテストコードを見ずに、これまでに試したことを知ることなく、成功する必要があることを正確に伝えることはできません。つまり、別のスレッドからthreading.local()オブジェクトの情報を編集しようとすると、最もクリーンなパスではないことがわかります。

一般に、他のスレッドにコールを送信する最も良い方法は、threading.Event()オブジェクトです。通常、スレッドはEvent()オブジェクトをリッスンし、それに基づいてアクションを実行します。この場合、GETリクエストの場合にハンドラにイベントを設定させることができます。

次に、cgiファイルを書き込んでいるスレッドに、Event()オブジェクトが設定されているときに、必要なデータを記録し、Event()オブジェクトの設定を解除する機能を持たせます。擬似コードでそう

、:だから

import threading 

evt = threading.Event() 

def noteTaker(evt): 
    while True: 
    if evt.wait(): 
     modifyDataYouNeed() 
     f.open() 
     f.write() 
     f.close() 
     evt.clear() 

def do_GET(evt): 
    print "so, a query hit your webserver" 
    evt.set() 
    print "and noteTaker was just called" 

、私は直接あなたの質問に答えることができませんでしたが、私はこのスレッドの通信方法にいくつかを助け、あなたが必要なものを推測するのに役立ちます願っています:)

情報をスレッド(私はあなたが既に読んで確信しているが、勤勉のためとして)here

+0

ですうーん...多くのイベントに見ていません。イベントに辞書などのデータを含めることはできますか? – jath03

+0

そして、cgiファイルにスレッド_writing_がないことを明確にするために、スレッドはcgiファイルによって読み取られる '.dat'ファイルに書き込んでいます。 – jath03

+0

スレッドに応じて異なるデータが必要なので、これは 'threading.local'と置き換えようとしている部分です。 – jath03

関連する問題