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