我有下面的代码,我想将其用于接收带有数据的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()
答案 0 :(得分:0)
为什么不尝试使用唯一文件名? 这样,您可以确保不会发生名称冲突。 看一下https://docs.python.org/2/library/tempfile.html,考虑一下NamedTemporaryFile函数。您应该使用delete = False,否则在close()之后立即删除文件。
答案 1 :(得分:0)
根据您的问题,我了解的是,您只有一台标签打印机,并且有多个生产者试图在其上打印标签。
因此,即使您切换到多线程选项,您也必须同步线程,以避免死锁和无限等待,
所以我最好的选择是使用名为queue的内置python数据结构
根据doc
队列模块实现多生产者,多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。此模块中的Queue类实现所有必需的锁定语义。这取决于Python中线程支持的可用性,
即使它是一个由多个消费者,多个生产者组成的队列,我想它仍然可以像魅力一样为您服务。
这就是您需要做的
或者如果您希望系统足够大,则可以使用以下链接,但是步骤与上述步骤相同