2011-02-10 126 views
0

我在Windows上運行Apache/Mod_WSGI下的Django服務器。作爲處理我的用戶請求的一部分,我做了很多需要網絡I/O的事情。我通過Django ORM運行查詢(到另一臺機器上的數據庫服務器)。我也做非Django的ODBC查詢,我讀網絡共享上的文件和目錄,我颳了其他網站。在Django中阻塞網絡調用阻止所有線程?

我敢肯定,至少我的一些網絡I/O阻塞(ODBC的查詢和網絡刮飛躍記)。而Windows上的Apache只有一個線程處理模型,而不是一個多進程模型。

所以我的第一個問題是:如果我做一個阻塞網絡電話同時響應的請求,並阻止所有的Apache服務器內的真實響應請求線程,或者僅僅是線程?

我的第二個問題是:任何這四種網絡電話(Django的ORM,ODBC,網絡共享,HTTP)已知非阻塞?

回答

2

簡單的答案是否定的,它不應該阻止其他請求線程。這雖然取決於C代碼底層的東西釋放圍繞阻止調用的Python GIL。所有圍繞系統網絡和文件系統功能的Python代碼包裝都會正確地做到這一點。對於主流的數據庫適配器,你也應該沒問題,因爲他們也會根據需要釋放GIL。阻塞的問題通常只有天真地編寫的第三方C擴展模塊,人們不知道什麼更好,但現在很少見。