繁体   English   中英

如何将Queue传递给baseHTTPServer

[英]How to pass Queue to baseHTTPServer

我将示例与波纹管一起使用,它是一个简单的http服务器,用于侦听发布请求并收集主进程的数据。 我想将其转换为使用多处理并传递一个Queue来收集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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM