成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【tulip】 - 多進程的版本

ACb0y / 3056人閱讀

摘要:前面的網(wǎng)絡(luò)編程的例子使用多進程也是可以實現(xiàn)的其中之后會創(chuàng)建一個子進程。從效率上來說,具有多線程一樣的問題,而且內(nèi)存占用會更高,切換成本也更高。多線程和多進程的版本從代碼可讀性上來說還是非常不錯的,很好懂,從上至下平鋪直敘的。

前面的網(wǎng)絡(luò)編程的例子使用多進程也是可以實現(xiàn)的:

import socket
import os

def main():
    listen_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=socket.IPPROTO_IP)
    listen_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    listen_sock.bind(("0.0.0.0", 9090))
    listen_sock.listen(0)
    while True:
        conn_sock, client_addr = listen_sock.accept()
        pid = os.fork()
        if pid == 0: # I am child process
            serve(conn_sock, client_addr)
        else: # I am parent process
            conn_sock.close()

def serve(conn_sock, client_addr):
    print("connected from %s:%s" % client_addr)
    input = conn_sock.recv(8192)
    while "done" != input.strip():
        conn_sock.sendall(input)
        input = conn_sock.recv(8192)
    conn_sock.sendall("bye!
")
    conn_sock.close()

main()

其中os.fork()之后會創(chuàng)建一個子進程。子進程默認(rèn)會繼承所有父進程的所有file descriptor(也就包括打開的socket),已經(jīng)擁有fork前父進程的所有內(nèi)存狀態(tài)。所以子進程可以拿著父進程打開的conn_sock繼續(xù)與客戶端通信。而父進程在把conn_sock交給子進程之后,就不再需要開著這個socket的fd了,所以就需要關(guān)閉掉。否則,子進程調(diào)用conn_sock.close()之后,客戶端的連接其實還沒有斷開,因為父進程還拿著fd不放呢。
從調(diào)度的角度來看,前面說的兩個要素:

狀態(tài)的保存:仍然是保存在棧上。每個進程都有一個主線程。fork出來的子進程的主線程的棧上保存了對應(yīng)客戶端的conn_sock。

不同socket之間的調(diào)度:仍然是利用內(nèi)核的scheduler,只是這次調(diào)度的是process。對于內(nèi)核來說調(diào)度邏輯是差不多的,區(qū)別就是process還要額外更新一下虛擬內(nèi)存的映射表,使得多個process彼此之間不可見對方的內(nèi)存。

從效率上來說,具有多線程一樣的問題,而且內(nèi)存占用會更高,切換成本也更高。多線程和多進程的版本從代碼可讀性上來說還是非常不錯的,很好懂,從上至下平鋪直敘的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45304.html

相關(guān)文章

  • tulip】 - 線程版本

    摘要:最重要的是每個線程,對應(yīng)了一個函數(shù)的執(zhí)行。有多個線程同時執(zhí)行的時候,每個線程的狀態(tài)是由操作系統(tǒng)內(nèi)核負(fù)責(zé)保存在內(nèi)存中的。在多線程的實現(xiàn)中。并且內(nèi)核的線程在切換多個線程的時候,線程切換的開銷是比較大。 上次的網(wǎng)絡(luò)編程的例子,改寫成多線程的是這樣: import socket import thread def main(): listen_sock = socket.socke...

    CoderStudy 評論0 收藏0
  • tulip】 - I/O阻塞小例子

    摘要:在了解了的實現(xiàn)方式的基礎(chǔ)之上,希望能夠把流程阻塞的功能在的框架之上實現(xiàn),從而可以制作一個簡單的類似,這樣的集群調(diào)度工具。我們先來看一個最基本的網(wǎng)絡(luò)編程的例子這是一個服務(wù)器。 接下來,會把Python tulip這個網(wǎng)絡(luò)庫(也就是3.4之后的asyncio)如何實現(xiàn)的進行一些分析。在了解了tulip的實現(xiàn)方式的基礎(chǔ)之上,希望能夠把流程阻塞的功能在tulip的框架之上實現(xiàn),從而可以制作一個...

    JessYanCoding 評論0 收藏0
  • tulip】 - IOCP

    摘要:簡單來說就是一個操作系統(tǒng)提供的回調(diào)機制。其中這一步是創(chuàng)建,是做一個調(diào)用,后面的是輪詢,這一步是根據(jù)返回的查找對應(yīng)的回調(diào)函數(shù)回調(diào)。這樣狀態(tài)從多個線程的多個棧上,變成了只有一個線程,但是在線程內(nèi)部有一個來維護單線程內(nèi)多個并發(fā)流程的狀態(tài)。 為了讓I/O阻塞的時候,程序還可以去干別的。除了使用線程模型,讓操作系統(tǒng)的內(nèi)核去調(diào)度多個線程,Windows提供了IOCP機制。簡單來說就是一個操作系統(tǒng)提...

    Sunxb 評論0 收藏0
  • Python 開發(fā)者在遷移到 Go(lang) 時需要知道哪些事?

    摘要:如果你只對開發(fā)者需要了解的事感興趣,請下拉到早該知道的事板塊。在不泄露機密的情況下,利用支持向量機來獲取一個句子最可能的意思,并且以此來推斷句子的情感。也就是說,如果一個文檔包含個詞,就會與支持向量機進行多次對比。 【編者按】本文最早由 Repustate 發(fā)布,主要介紹將代碼遷移至 Go(lang) 時的注意事項。文章系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn),以下為正文。 ...

    hqman 評論0 收藏0
  • 【generator101】 - yield from

    摘要:我們可以看一下的可見是由內(nèi)部支持的,其實現(xiàn)原理上就避免了棧進棧出的消耗,直接由最內(nèi)層的返回值。另外可以實現(xiàn)外部直接向最內(nèi)層的傳遞值,比如這段代碼的輸出是這樣傳值的方式,在用循環(huán)重新的模式下是無法實現(xiàn)的。這也就是必須使用,而不能使用的原因。 在python 3.3里,generator新增了一個語法 yield from 這個yield from的作用是什么?看下面兩段對比的代碼: d...

    xiaodao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<