3

我正在使用 web.py 框架。出于调试目的,我想强制所有请求由单个线程处理,或者使用互斥锁模拟这种行为。我怎样才能做到这一点?

4

2 回答 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 回答