デーモンスレッド(デーモンスレッドだけが残っているとPythonプログラムが終了します)でWebサーバーを起動し、メインスレッドからリクエストを行うことができます。
唯一の問題は、メインスレッドをサーバースレッドに同期させることです。これは、HTTPサーバーが起動するまでに時間がかかるため、この時点まで要求を処理しないためです。私はそれを行うための簡単できれいな解決策を認識していませんが、ちょうどあなたのメインスレッドを数秒間(おそらくは短く)一時停止し、その後に要求を開始することができます。もう1つの選択肢は、Webサーバーへのリクエストを最初から送信し、ある程度時間がかかって失敗することを期待することです。
ここでは、ローカルファイルシステムからのコンテンツを提供するシンプルなHTTPウェブサーバーを使用した小さなサンプルスクリプトlocalhost:8080
とサンプルリクエストがあり、Webサーバー(この場合もスクリプト)のディレクトリからファイルfoo.txt
を要求しています。
import sys
import requests
import threading
import time
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
# set up the HTTP server and start it in a separate daemon thread
httpd = HTTPServer(('localhost', 8080), SimpleHTTPRequestHandler)
thread = threading.Thread(target=httpd.serve_forever)
thread.daemon = True
# if startup time is too long we might want to be able to quit the program
try:
thread.start()
except KeyboardInterrupt:
httpd.shutdown()
sys.exit(0)
# wait until the webserver finished starting up (maybe wait longer or shorter...)
time.sleep(5)
# start sending requests
r = requests.get('http://localhost:8080/foo.txt')
print r.status_code
# => 200 (hopefully...)
私はスレッドを見ていました。そして、これは完全に動作します。しかし、 'sys.exit(0)'を使用して終了しようとすると、 'error:[Errno 10054]という既存の接続がリモートホストによって強制的に閉じられました。これは、スレッドを「終了」するための正しい方法ですか、より良い方法がありますか? – Apara