欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

django多線程是什么

這篇文章將為大家詳細講解有關(guān)django多線程是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)主營欽州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,欽州h5小程序開發(fā)搭建,欽州網(wǎng)站營銷推廣歡迎欽州等地區(qū)企業(yè)咨詢

在一段完整的代碼中,往往會有需要獨立的代碼模塊,而這些獨立運行的程序片段叫作“線程”(Thread),利用多個線程編程的概念就叫作多線程處理(多線程編程),多線程是為了同步完成多項任務(wù),不是為了提高運行效率,而是為了提高資源使用效率來提高系統(tǒng)的效率。多線程是在程序在同一時間需要完成多項任務(wù)的時候?qū)崿F(xiàn)的。多線程的目的僅僅是為了提高資源利用效率。各個線程執(zhí)行自己的任務(wù),這些線程可以”同時進行“。同時進行并非同一時刻進行,而是在某一時間段內(nèi),完成所有任務(wù),任務(wù)的運行有先后順序。

簡單的說就是服務(wù)端監(jiān)聽 socket 每次 accept 一個新的請求后,開一個線程處理 這個 socket 客戶連接。如果你對底層實現(xiàn)原理感興趣,可以繼續(xù)看下去,從 socket 編程的角度來解釋多線程 wsgi server。最后附上一個異步框架工作過程的視頻講解。這里我們自己擼一個簡單的多線程 wsgi server 來看下原理,還是需要深入源碼和 socket 編程你才能真正理解。 我們從 python 自帶的一個 wsgi server 看下如何實現(xiàn)多線程處理請求。首先你需要熟悉下 wsgi。 看一個最簡單的 wsgi app:

def application(environ, start_response):
    status = '200 OK'
    headers = [('Content-Type', 'text/html; charset=utf8')]

    start_response(status, headers)
    return [b"<h2>Hello</h2>"]if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    httpd = make_server('127.0.0.1', 8000, application)
    httpd.serve_forever()

然后用你的開發(fā)工具跟進去 make_server 這個函數(shù),看下它的定義:

def make_server(
    host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler):
    """Create a new WSGI server listening on `host` and `port` for `app`"""
    server = server_class((host, port), handler_class)
    server.set_app(app)
    return serverclass WSGIServer(HTTPServer):

    """BaseHTTPServer that implements the Python WSGI protocol"""

    application = None

    def server_bind(self):
        """Override server_bind to store the server name."""
        HTTPServer.server_bind(self)
        self.setup_environ()

    def setup_environ(self):
        # Set up base environment
        env = self.base_environ = {}
        env['SERVER_NAME'] = self.server_name
        env['GATEWAY_INTERFACE'] = 'CGI/1.1'
        env['SERVER_PORT'] = str(self.server_port)
        env['REMOTE_HOST']=''
        env['CONTENT_LENGTH']=''
        env['SCRIPT_NAME'] = ''

    def get_app(self):
        return self.application    def set_app(self,application):
        self.application = application

看到這個 WSGIServer 定義了嗎,繼承了一個 HttpServer。我們再繼續(xù)追一下其定義:

class HTTPServer(SocketServer.TCPServer):

    allow_reuse_address = 1    # Seems to make sense in testing environment

    def server_bind(self):
        """Override server_bind to store the server name."""
        SocketServer.TCPServer.server_bind(self)
        host, port = self.socket.getsockname()[:2]
        self.server_name = socket.getfqdn(host)
        self.server_port = port

到這里,我們繼續(xù)追,看到 TcpServer 定義:

class TCPServer(BaseServer):
    """這里我省略了定義"""

你還可以發(fā)現(xiàn)一個 ThreadingTCPServer 類:我們看下它的定義

class ThreadingTCPServer(ThreadingMixIn, TCPServer): 
		pass

好了,怎么多線程處理請求呢?看下這個 ThreadingMixIn 類是如何實現(xiàn)的:

class ThreadingMixIn:
    """Mix-in class to handle each request in a new thread."""

    # Decides how threads will act upon termination of the
    # main process
    daemon_threads = False

    def process_request_thread(self, request, client_address):
        """Same as in BaseServer but as a thread.

        In addition, exception handling is done here.

        """
        try:
            self.finish_request(request, client_address)
            self.shutdown_request(request)
        except:
            self.handle_error(request, client_address)
            self.shutdown_request(request)

    def process_request(self, request, client_address):
        """Start a new thread to process the request."""
        t = threading.Thread(target = self.process_request_thread,
                             args = (request, client_address))
        t.daemon = self.daemon_threads
        t.start()

看到嗎,其實就是對于每個新請求,會啟動一個新的線程來處理 socket 請求。假如讓我們自己實現(xiàn)一個多線程 socket server 應(yīng)該怎么實現(xiàn)呢?先來寫一個簡單的單線程 socker echo server:

from socket import *  # 偷懶這么寫s = socket(AF_INET, SOCK_STREAM)s.bind(("", 9000))s.listen(5)while True:
    c, a = s.accept()
    print "Received connection from", a
    c.send("Hello %s\\n" % a[0])    
    c.close()

關(guān)于django多線程是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

名稱欄目:django多線程是什么
網(wǎng)站鏈接:http://www.chinadenli.net/article40/jcosho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)定制網(wǎng)站用戶體驗網(wǎng)站營銷網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)