如何在python中不再提供一个HTTP请求?

如何在python中不再提供一个HTTP请求?,python,Python,我有一个简单的HTTP服务器设置,如。它处理一个缓慢的40秒请求,打开然后关闭闸门(真正的金属闸门)。若第二个HTTP查询是在第一个查询的执行过程中进行的,那个么它将被放入队列中,然后在第一次运行后执行。我不需要这种行为,如果门打开/关闭过程正在进行中,我需要用错误回复。 我该怎么做?有一个参数“request\u queue\u size”-但我不确定如何设置它。在设计服务器服务时,您需要遵循不同的策略。您需要将门的状态保存在内存或数据库中。然后,每次收到对门执行某项操作的请求时,您都会在持久

我有一个简单的HTTP服务器设置,如。它处理一个缓慢的40秒请求,打开然后关闭闸门(真正的金属闸门)。若第二个HTTP查询是在第一个查询的执行过程中进行的,那个么它将被放入队列中,然后在第一次运行后执行。我不需要这种行为,如果门打开/关闭过程正在进行中,我需要用错误回复。
我该怎么做?有一个参数“request\u queue\u size”-但我不确定如何设置它。

在设计服务器服务时,您需要遵循不同的策略。您需要将门的状态保存在内存或数据库中。然后,每次收到对门执行某项操作的请求时,您都会在持久性中检查门的当前状态,然后如果可以在当前状态下执行该操作,则执行该操作,否则返回错误。此外,不要忘记在操作完成后更新门的状态

在设计服务器服务时,您需要遵循不同的策略。您需要将门的状态保存在内存或数据库中。然后,每次收到对门执行某项操作的请求时,您都会在持久性中检查门的当前状态,然后如果可以在当前状态下执行该操作,则执行该操作,否则返回错误。此外,不要忘记在操作完成后更新门的状态

通常,您正在寻找的想法称为请求节流。这类东西有很多实现,在网络上挖掘起来应该不难:这里有一个是针对Flask的,我选择的微框架-

快速使用示例:

@app.route("/open_gate")
@limiter.limit("1 per minute")
def slow():
    gate_robot.open_gate()
    return 

通常,您正在寻找的想法称为请求节流。这类东西有很多实现,在网络上挖掘起来应该不难:这里有一个是针对Flask的,我选择的微框架-

快速使用示例:

@app.route("/open_gate")
@limiter.limit("1 per minute")
def slow():
    gate_robot.open_gate()
    return 

“请求队列大小”似乎没有效果。 解决方案是使服务器多线程,并实现锁定变量“busy”:

from socketserver import ThreadingMixIn
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
from gpiozero import DigitalOutputDevice
import logging
from time import sleep
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.INFO)

hostName = ''
hostPort = 9001
busy = False

class ThreadingServer(ThreadingMixIn, HTTPServer):
    pass

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        global busy
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("Hello!<br>", "utf-8"))
        if self.path == '/gates':
           if not busy:
             busy = True
             relay = DigitalOutputDevice(17) # Initialize GPIO 17
             relay.on()
             logging.info('Cycle started')
             self.wfile.write(bytes("Cycle started<br>", "utf-8"))
             sleep(2)
             relay.close()
             sleep(20)
             relay = DigitalOutputDevice(17)
             relay.on()
             sleep(2)
             relay.close()
             logging.info('Cycle finished')
             self.wfile.write(bytes("Cycle finished", "utf-8"))
             busy = False
           else:
#             self.wfile.write(bytes("Busy now!<br>", "utf-8"))
             self.send_error(503)

myServer = ThreadingServer((hostName, hostPort), MyServer)
print(time.asctime(), "Server Starts - %s:%s" % (hostName, hostPort))

try:
    myServer.serve_forever()
except KeyboardInterrupt:
    pass

myServer.server_close()
print(time.asctime(), "Server Stops - %s:%s" % (hostName, hostPort))
从socketserver导入ThreadingMixIn
从http.server导入BaseHTTPRequestHandler,HTTPServer
导入时间
从gpiozero导入DigitalOutputDevice
导入日志记录
从时间上导入睡眠
logging.basicConfig(格式='%(asctime)s%(levelname)s:%(message)s',level=logging.INFO)
主机名=“”
主机端口=9001
忙=假
类ThreadingServer(ThreadingMixIn,HTTPServer):
通过
类MyServer(BaseHTTPRequestHandler):
def do_获得(自我):
全球繁忙
自我发送_响应(200)
self.send_标题(“内容类型”、“文本/html”)
self.end_头()
self.wfile.write(字节(“Hello!
”,“utf-8”)) 如果self.path='/gates': 如果不忙: 忙=真 继电器=数字输出设备(17)#初始化GPIO 17 接力 logging.info('循环已开始') self.wfile.write(字节(“循环开始
”,“utf-8”)) 睡眠(2) 继电器关闭() 睡眠(20) 继电器=数字输出设备(17) 接力 睡眠(2) 继电器关闭() logging.info('循环已完成') self.wfile.write(字节(“循环完成”,“utf-8”)) 忙=假 其他: #self.wfile.write(字节(“现在忙!”
,“utf-8”)) self.send_错误(503) myServer=ThreadingServer((主机名,主机端口),myServer) 打印(time.asctime(),“服务器启动-%s:%s”%(主机名,主机端口)) 尝试: myServer.serve_ever() 除键盘中断外: 通过 myServer.server_close() 打印(time.asctime(),“服务器停止-%s:%s”%(主机名,主机端口))
“请求队列大小”似乎没有效果。 解决方案是使服务器多线程,并实现锁定变量“busy”:

from socketserver import ThreadingMixIn
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
from gpiozero import DigitalOutputDevice
import logging
from time import sleep
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.INFO)

hostName = ''
hostPort = 9001
busy = False

class ThreadingServer(ThreadingMixIn, HTTPServer):
    pass

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        global busy
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("Hello!<br>", "utf-8"))
        if self.path == '/gates':
           if not busy:
             busy = True
             relay = DigitalOutputDevice(17) # Initialize GPIO 17
             relay.on()
             logging.info('Cycle started')
             self.wfile.write(bytes("Cycle started<br>", "utf-8"))
             sleep(2)
             relay.close()
             sleep(20)
             relay = DigitalOutputDevice(17)
             relay.on()
             sleep(2)
             relay.close()
             logging.info('Cycle finished')
             self.wfile.write(bytes("Cycle finished", "utf-8"))
             busy = False
           else:
#             self.wfile.write(bytes("Busy now!<br>", "utf-8"))
             self.send_error(503)

myServer = ThreadingServer((hostName, hostPort), MyServer)
print(time.asctime(), "Server Starts - %s:%s" % (hostName, hostPort))

try:
    myServer.serve_forever()
except KeyboardInterrupt:
    pass

myServer.server_close()
print(time.asctime(), "Server Stops - %s:%s" % (hostName, hostPort))
从socketserver导入ThreadingMixIn
从http.server导入BaseHTTPRequestHandler,HTTPServer
导入时间
从gpiozero导入DigitalOutputDevice
导入日志记录
从时间上导入睡眠
logging.basicConfig(格式='%(asctime)s%(levelname)s:%(message)s',level=logging.INFO)
主机名=“”
主机端口=9001
忙=假
类ThreadingServer(ThreadingMixIn,HTTPServer):
通过
类MyServer(BaseHTTPRequestHandler):
def do_获得(自我):
全球繁忙
自我发送_响应(200)
self.send_标题(“内容类型”、“文本/html”)
self.end_头()
self.wfile.write(字节(“Hello!
”,“utf-8”)) 如果self.path='/gates': 如果不忙: 忙=真 继电器=数字输出设备(17)#初始化GPIO 17 接力 logging.info('循环已开始') self.wfile.write(字节(“循环开始
”,“utf-8”)) 睡眠(2) 继电器关闭() 睡眠(20) 继电器=数字输出设备(17) 接力 睡眠(2) 继电器关闭() logging.info('循环已完成') self.wfile.write(字节(“循环完成”,“utf-8”)) 忙=假 其他: #self.wfile.write(字节(“现在忙!”
,“utf-8”)) self.send_错误(503) myServer=ThreadingServer((主机名,主机端口),myServer) 打印(time.asctime(),“服务器启动-%s:%s”%(主机名,主机端口)) 尝试: myServer.serve_ever() 除键盘中断外: 通过 myServer.server_close() 打印(time.asctime(),“服务器停止-%s:%s”%(主机名,主机端口))
将有助于查看一些代码……也许您可以有一个“冷却”期,在收到另一个请求后,在某个窗口内(例如,一分钟以确保安全?)收到请求时,您会回复HTTP 503服务不可用错误?我现在没有确切的代码,但在这个例子中,99%是这样的:这有助于查看一些代码…也许你可以有一个“冷却”期,每当你收到一个requ