Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将队列传递给baseHTTPServer_Python_Basehttpserver - Fatal编程技术网

Python 如何将队列传递给baseHTTPServer

Python 如何将队列传递给baseHTTPServer,python,basehttpserver,Python,Basehttpserver,我正在使用下面的示例bellow with Thread,这是一个简单的http服务器,用于侦听post请求并为主进程收集数据。 我想将其转换为使用多处理和传递队列来收集POST数据,但我不确定如何传递,知道如何传递吗 from threading import Thread from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler from io import BytesIO KEEP_RUNNING = True COLLE

我正在使用下面的示例bellow with Thread,这是一个简单的http服务器,用于侦听post请求并为主进程收集数据。 我想将其转换为使用多处理和传递队列来收集POST数据,但我不确定如何传递,知道如何传递吗

from threading import Thread
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO

KEEP_RUNNING = True
COLLECT_POST_DATA = []

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        print("body: {}".format(body))
        COLLECT_POST_DATA.append(body)
        self.send_response(200)
        self.end_headers()
        response = BytesIO()
        response.write(b'This is POST request. ')
        response.write(b'Received: ')
        response.write(body)
        self.wfile.write(response.getvalue())

def run_server(port):
    httpd = HTTPServer(('0.0.0.0', port), SimpleHTTPRequestHandler)
    httpd.timeout = 1
    while KEEP_RUNNING:
        httpd.handle_request()
    # httpd.serve_forever()

t = Thread(target = run_server, args=(8000,))
t.start()

# to kill
KEEP_RUNNING = False
所以我想:

import multiprocessing
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO

class QueuingHTTPServer(HTTPServer):

    # def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, queue=False):
    def __init__(self, server_address, RequestHandlerClass, queue, bind_and_activate=True):
        HTTPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate)
        self.queue = queue

class PostHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        print("body: {}".format(body))
        self.send_response(200)
        self.end_headers()
        response = BytesIO()
        response.write(b'This is POST request. ')
        response.write(b'Received: ')
        response.write(body)
        self.wfile.write(response.getvalue())
        self.server.queue.put(body)

def run_server(port, queue):
    print('run_server')
    httpd = QueuingHTTPServer(('0.0.0.0', port), PostHTTPRequestHandler, queue)
    httpd.timeout = 2
    while True:
        httpd.handle_request()
    # httpd.serve_forever()

queue = multiprocessing.Queue()
p = multiprocessing.Process(target=run_server, name='serve', args=(8000, queue))
p.start()
尝试以下方法:

curl hostip:8000 -m 5 -d"12.12.12.12"
然后从脚本中:

data = queue.get(timeout=2)
杀人者:

p.terminate()