Skip to content

Instantly share code, notes, and snippets.

@p--q

p--q/Python6.py Secret

Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save p--q/558d9531cff0dcc8e103 to your computer and use it in GitHub Desktop.
Save p--q/558d9531cff0dcc8e103 to your computer and use it in GitHub Desktop.
マルチスレッド化したWSGIサーバの例
# -*- coding: utf-8 -*-
from wsgiref import simple_server
import socketserver
class ThreadedWSGIServer(socketserver.ThreadingMixIn, simple_server.WSGIServer): # WSGIServerをマルチスレッド対応にしたクラスを作成。
pass
def calc(val): # 引数を2倍にして返す関数。
return val*2
def app(environ, start_response): # WSGIアプリ。辞書environから情報を得る。
# import threading
# print(threading.current_thread().name) # スレッド名を出力。
import cgi
fs = cgi.FieldStorage(environ=environ) # environを引数にしてcgi.FieldStorageオブジェクトを取得。
if fs.getfirst('stop', 0): # stopの値が0以外のとき
server.shutdown() # WSGIサーバを停止する。
html = "終了" # 出力するhtmlを作成。
else:
val = int(fs.getfirst('value', 1)) # 最初に出会ったvalueの値を整数型にして取得。2番目の引数はデフォルト値。
c = int(fs.getfirst('counter', 0))+1 # 最初に出会ったcounterの値を整数型にして取得。2番目の引数はデフォルト値。
html = '''
{0}(=2<sup>{1}</sup>)を2倍にした計算結果 2<sup>{2}</sup>={3}<br>
<br>
<a href="http://{4}:{5}/?value={3}&counter={2}">この計算結果をさらに2倍する</a><br>
<br>
<a href="http://{4}:{5}">最初に戻る</a><br>
<br>
<a href="http://{4}:{5}/?stop=1">WSGIサーバを停止する</a>
'''.format(val, c-1, c, calc(val), host, port) # 出力するhtmlを作成。
start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) # start_responseを設定。
return [html.encode()] # htmlをUTF-8からバイト列に変換して返す。
if __name__ == "__main__": # ここから開始。
host, port = "localhost", 8000
server = simple_server.make_server(host, port, app, ThreadedWSGIServer) # appへの接続を受け付けるThreadedWSGIServerを生成。
url = "http://{}:{}".format(host, port) # 出力先のurlを取得。
import threading
server_thread = threading.Thread(target=server.serve_forever) # 要求によりスレッドを生成するメソッドをtargetに指定。
# server_thread.daemon = True # デーモンスレッドにするとメインスレッドが終わるとPythonプログラムが終了してしまう。
server_thread.start() # スレッドの受付を開始。
import webbrowser
webbrowser.open_new_tab(url) # デフォルトのブラウザでurlを開く。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment