使用web.py强制执行单线程请求处理

时间:2012-11-07 12:56:51

标签: multithreading thread-safety web.py

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

2 个答案:

答案 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()代码。