我正在使用 web.py 框架。出于调试目的,我想强制所有请求由单个线程处理,或者使用互斥锁模拟这种行为。我怎样才能做到这一点?
user1512023
问问题
1286 次
2 回答
5
让我提出这样的建议,但它只会将当前应用程序堆栈锁定在您的控制器方法上。
import web
from threading import Lock
urls = ("/", "Index")
class Index:
def GET(self):
# This will be locked
return "hello world"
def mutex_processor():
mutex = Lock()
def processor_func(handle):
mutex.acquire()
try:
return handle()
finally:
mutex.release()
return processor_func
app = web.application(urls, globals())
app.add_processor(mutex_processor())
if __name__ == "__main__":
app.run()
UPD:如果您需要锁定整个应用程序堆栈,那么您可能必须app.wsgifunc
使用自己的 WSGI 中间件进行包装。要获得一个想法,请检查我对这个问题的回答。
于 2012-11-07T18:19:54.100 回答
2
为了使事情体面地进入单线程调试模式,可以使用单线程 WSGI 服务器运行 web.py 应用程序。
这样的服务器“几乎”由 web.py 本身提供,因为web.httpserver.runbasic()
它使用 Python 的内置BaseHTTPServer.HTTPServer
- 而且SocketServer.ThreadingMixIn
. 然而,这ThreadingMixIn
可以被这样的东西阻止:
# single threaded execution of web.py app
app = web.application(urls, globals())
# suppress ThreadingMixIn in web.httpserver.runbasic()
import SocketServer
class NoThreadingMixIn:
pass
assert SocketServer.ThreadingMixIn
SocketServer.ThreadingMixIn = NoThreadingMixIn
web.httpserver.runbasic(app.wsgifunc())
或者您可以复制相当短的web.httpserver.runbasic()
代码。
于 2017-04-04T08:06:15.220 回答