我正在使用web.py框架。出于调试目的,我想强制所有请求由单个线程处理,或使用互斥锁模拟此类行为。我怎么能这样做?
答案 0 :(得分: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:如果你需要锁定整个应用程序堆栈,那么你可能需要用自己的WSGI中间件包装app.wsgifunc
。要理解我的答案to this question。
答案 1 :(得分: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()
代码。