2017-06-29 15 views
0

スレッドまたはパラレルプロセスでローカライズされたWebサーバーを実行し、同じPythonプログラムでそのWebサーバーからurlを照会できるようにしたいと考えています。私はhtml自己動機付けスライドを構築していて、qtを使ってそれらをWebブラウザに表示します。他のコードと並行してPython Webサーバーを実行する

Webサーバーは、ローカルで、非常に少ないボリュームでしか照会されません。

スレッド処理を使用して、このプログラムでマルチプロセッシングを使用しようとしました。私は両方から同様のスタックトレースを取得します。

私の質問: Webサーバーを起動しても、Webサーバーの起動後に実行されるコードをブロックする方法はありますか?

import http.server 
import socketserver 
import os 
from multiprocessing import Process 
import time 

def run_webserver(): 
    cwd = os.getcwd() 
    os.chdir("./www/public") 
    PORT = 8002 
    Handler = http.server.SimpleHTTPRequestHandler 

    with socketserver.TCPServer(("", PORT), Handler) as httpd: 
     print("serving at port", PORT) 

    return httpd 

if __name__ == '__main__': 
    httpd = run_webserver() 
    p = Process(target=httpd.serve_forever, args=()) 
    p.start() 
    p.join() 

    # do other work 
    for i in range(200): 
     print(str(i)) 
     time.sleep(500) 

serving at port 8002 
Process Process-1: 
Traceback (most recent call last): 
    File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/ process.py", line 249, in _bootstrap 
    self.run() 
    File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/ process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
    File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socketserver.py", line  233, in serve_forever 
    selector.register(self, selectors.EVENT_READ) 
    File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/selectors.py", line 351,  in register 
    key = super().register(fileobj, events, data) 
    File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/selectors.py", line 237,  in register 
    key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) 
    File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/selectors.py", line 224,  in _fileobj_lookup 
    return _fileobj_to_fd(fileobj) 
    File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/selectors.py", line 41,  in _fileobj_to_fd 
    raise ValueError("Invalid file descriptor: {}".format(fd)) 
ValueError: Invalid file descriptor: -1 
+0

['multiprocessing'](https://stackoverflow.com/a/20549090/1362294)モジュールを使用してみましたか? – darksky

答えて

0

大丈夫です。

import http.server 
import socketserver 
import os 
import multiprocessing 
import time 

def run_webserver(): 
    os.chdir("./www/public") 
    PORT = 8002 
    Handler = http.server.SimpleHTTPRequestHandler 
    httpd = socketserver.TCPServer(('0.0.0.0', PORT), Handler) 

    #the following throws an exception 
    #with socketserver.TCPServer(("0.0.0.0", PORT), Handler) as httpd: 
    # print("serving at port", PORT) 

    httpd.serve_forever(poll_interval=0.5) 

    return 

if __name__ == '__main__': 
    p = multiprocessing.Process(target=run_webserver, args=()) 
    p.daemon = True 
    p.start() 

    # do other work 
    for i in range(200): 
     print(str(i)) 
     time.sleep(1) 
関連する問題