在通過pymssql訪問SQL Server時,直接在python中運行沒有問題,在通過mod_wsgi和Apache進行部署時,發現所有請求都hang再數據庫查詢。
通過google查到了答案,感謝google,詳細描述請見:https://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API
簡要說一下,mod_wsgi針對每個virtual host和app mount point創建一個sub interpreter。python中有個著名的GIL,在通過C extension訪問GIL State時,只有第一個sub interpreter纔可以正常工作,如果使用後續的sub interpreter會導致死鎖或crash,因爲pymssql是一個C extension所以會有這個問題,解決方案是,添加配置項:
WSGIApplicationGroup %{GLOBAL}
強制該app使用第一個sub interpreter,使得GIL正常工作。改完後,mod_wsgi一切ok。