国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【tulip】 - 多進程的版本

ACb0y / 3044人閱讀

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

前面的網絡編程的例子使用多進程也是可以實現的:

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()之后會創建一個子進程。子進程默認會繼承所有父進程的所有file descriptor(也就包括打開的socket),已經擁有fork前父進程的所有內存狀態。所以子進程可以拿著父進程打開的conn_sock繼續與客戶端通信。而父進程在把conn_sock交給子進程之后,就不再需要開著這個socket的fd了,所以就需要關閉掉。否則,子進程調用conn_sock.close()之后,客戶端的連接其實還沒有斷開,因為父進程還拿著fd不放呢。
從調度的角度來看,前面說的兩個要素:

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45304.html

相關文章

  • tulip】 - 線程版本

    摘要:最重要的是每個線程,對應了一個函數的執行。有多個線程同時執行的時候,每個線程的狀態是由操作系統內核負責保存在內存中的。在多線程的實現中。并且內核的線程在切換多個線程的時候,線程切換的開銷是比較大。 上次的網絡編程的例子,改寫成多線程的是這樣: import socket import thread def main(): listen_sock = socket.socke...

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

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

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

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

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

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

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

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

    xiaodao 評論0 收藏0

發表評論

0條評論

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