Python-使用HTTPServer处理并发POST请求并保存到文件

时间:2019-01-18 08:34:59

标签: python

我有下面的代码,我想将其用于接收带有数据的POST请求,然后将这些数据用于在标签打印机上打印标签。为了打印标签,我需要使用打印命令编写文件,然后通过命令行执行lp命令以将文件复制到标签打印机。

我遇到的问题是可能有多个人同时打印标签。因此,我的问题是我是否必须更改下面的代码以使用ThreadingMixIn来处理并发POST请求,或者我可以将代码保留为原来的状态,并且在并发情况下,对次要请求只会有一点延迟(那是进一步的请求将排队并且不会丢失)?

如果必须使用线程化方式,如果现在有多个线程试图写入同一文件,这将如何影响文件的写入以及随后对lp的命令行调用?

请注意,有多个标签打印机正在通过打印队列(CUPS)访问。

import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello, world!')
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        try:
            result = json.loads(body, encoding='utf-8')
            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())
        except Exception as exc:
            self.wfile.write('Request has failed to process. Error: %s', exc.message)

httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
httpd.serve_forever()

2 个答案:

答案 0 :(得分:0)

为什么不尝试使用唯一文件名? 这样,您可以确保不会发生名称冲突。 看一下https://docs.python.org/2/library/tempfile.html,考虑一下NamedTemporaryFile函数。您应该使用delete = False,否则在close()之后立即删除文件。

答案 1 :(得分:0)

根据您的问题,我了解的是,您只有一台标签打印机,并且有多个生产者试图在其上打印标签。

因此,即使您切换到多线程选项,您也必须同步线程,以避免死锁和无限等待,

所以我最好的选择是使用名为queue的内置python数据结构

根据doc

  

队列模块实现多生产者,多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。此模块中的Queue类实现所有必需的锁定语义。这取决于Python中线程支持的可用性,

即使它是一个由多个消费者,多个生产者组成的队列,我想它仍然可以像魅力一样为您服务。

这就是您需要做的

  1. 您的服务器收到打印标签的请求,
  2. 进行必要的处理/清理并将其放入队列
  3. 工作线程从队列中弹出项目并执行任务

或者如果您希望系统足够大,则可以使用以下链接,但是步骤与上述步骤相同

  • RabbitMq-可伸缩的消息代理(只需放入队列)

  • Celery-一个python包,用于从消息代理(例如Rabbitmq)弹出项目并执行