簡體   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