最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么

 更新時間:2021年04月16日 10:06:42   作者:James Zeng  
本篇文章對Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么,進行了很好的講解,希望對大家有所幫助。一起跟隨小編過來看看吧

疑問

在調(diào)用socket的時候,我們會使用到listen()函數(shù),里面有個參數(shù)叫backlog, 例如:socket.listen(5). 那么這個數(shù)字5到底代表什么意思呢?網(wǎng)上有很多種說法,講的都是概念,很多都是復(fù)制粘貼,容易讓人誤解。

解答

下面使用具體的代碼片段來講解:

這是一個電腦本機模擬客服端及服務(wù)端的程序,主要功能是建立socket連接后,客戶端輸入關(guān)鍵字查詢對應(yīng)的段子,服務(wù)器端返回結(jié)果。服務(wù)器可以滿足同時服務(wù)兩個客戶的查詢操作此程序中還包含了信號量和多線程

以listen(1),參數(shù)設(shè)置為1進行講解,是不是將參數(shù)設(shè)置為1后,開啟3個客服連接就會報錯呢?并不是!

如下圖所示:

那么問題來了!

問題1:

如上例代碼中,有l(wèi)isten(1),這個1是指什么?只能與1個socket建立鏈接嗎? 為什么我用上面的代碼可以創(chuàng)建大于1個的tcp連接卻沒報錯,如果用網(wǎng)上其他人的說法理論上大于1個連接應(yīng)該報錯的!

因為:listen(n)傳入的值, n表示的是服務(wù)器拒絕(超過限制數(shù)量的)連接之前,操作系統(tǒng)可以掛起的最大連接數(shù)量。n也可以看作是"排隊的數(shù)量"

問題2:

既然沒有報錯,為什么沒有打印用戶3的地址?

因為:服務(wù)器正在處理用戶1和用戶2,沒有空閑去接待用戶3,所以用戶3去排隊了。

問題3:

為什么服務(wù)器能同時處理用戶1和用戶2?

因為:

這里用到了多線程和信號量,信號量設(shè)置為2,也就是允許并發(fā)數(shù)為2,服務(wù)器開啟了兩個線程,能同時分別處理用戶1和用戶2。

總結(jié)

socket.listen(n)

簡單來說,這里的nt表示socket的”排隊個數(shù)

一般情況下,一個進程只有一個主線程(也就是單線程),那么socket允許的最大連接數(shù)為: n + 1如果服務(wù)器是多線程,比如上面的代碼例子是開了2個線程,那么socket允許的最大連接數(shù)就是: n + 2換句話說:排隊的人數(shù)(就是那個n) + 正在就餐的人數(shù)(服務(wù)器正在處理的socket連接數(shù)) = 允許接待的總?cè)藬?shù)(socket允許的最大連接數(shù))

補充:關(guān)于Socket.listen方法的一點體悟

前言

最近在接觸Socket的的時候,關(guān)于其中的listen方法感到不解,于是對其進行了一番研究,得出了一點體悟,特此記錄。

詳解

讓我們先來看看listen方法在Python3.6文檔說明:

socket.listen([backlog])

Enable a server to accept connections. If backlog is specified, it must be at least 0 (if it is lower, it is set to 0); it specifies the number of unaccepted connections that the system will allow before refusing new connections. If not specified, a default reasonable value is chosen.

啟用服務(wù)器以接受連接。如果指定backlog,則必須至少為0(如果低于0,則設(shè)置為0);它指定系統(tǒng)在拒絕新連接之前將允許的未接受連接的數(shù)量。如果未指定,則選擇默認的合理值。

Changed in version 3.5: The backlog parameter is now optional.

在版本3.5中已更改: backlog參數(shù)現(xiàn)在是可選的。

起初我看了這說明想當然的以為是可以接入的Client上限,不過實踐過后發(fā)現(xiàn)并非如此。在網(wǎng)上找的解答基本上就是文檔所言的復(fù)述,后來請教了專業(yè)人士后,方知這涉及到Socket的底層知識。

在了解listen方法之前,首先我們需要了解connect方法和accept方法,以下是文檔說明:

socket.connect(address)

Connect to a remote socket at address. (The format of address depends on the address family — see above.)

在地址連接到遠程套接字。(地址的格式取決于地址系列 - 請參見上文)

If the connection is interrupted by a signal, the method waits until the connection completes, or raise a socket.timeout on timeout, if the signal handler doesn't raise an exception and the socket is blocking or has a timeout. For non-blocking sockets, the method raises an InterruptedError exception if the connection is interrupted by a signal (or the exception raised by the signal handler).

如果連接被信號中斷,則該方法等待直到連接完成,或者如果信號處理程序沒有引發(fā)異常并且套接字正在阻塞或者已經(jīng)阻塞,則在超時時引入socket.timeout超時。對于非阻塞套接字,如果連接被信號中斷(或由信號處理程序引發(fā)的異常),則該方法引發(fā)InterruptedError異常。

Changed in version 3.5: The method now waits until the connection completes instead of raising an InterruptedError exception if the connection is interrupted by a signal, the signal handler doesn't raise an exception and the socket is blocking or has a timeout (see the PEP 475 for the rationale).

在版本3.5中已更改:該方法現(xiàn)在等待直到連接完成,而不是提高InterruptedError異常,如果連接被信號中斷,信號處理程序不引發(fā)異常,套接字阻塞或超時(參見 PEP 475)。

socket.accept()

Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection.

接收一個連接.該socket 必須要綁定一個地址和監(jiān)聽連接.返回值是一對(conn, 地址)其中conn是新 t4 > socket對象可用于在連接上發(fā)送和接收數(shù)據(jù),address是連接另一端的套接字的地址。

The newly created socket is non-inheritable.

新創(chuàng)建的套接字non-inheritable。

Changed in version 3.4: The socket is now non-inheritable.

在版本3.4中更改:套接字現(xiàn)在是不可繼承的。

Changed in version 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an InterruptedError exception (see PEP 475 for the rationale).

在版本3.5中更改:如果系統(tǒng)調(diào)用中斷并且信號處理程序沒有引發(fā)異常,則此方法現(xiàn)在重試系統(tǒng)調(diào)用,而不是引發(fā)InterruptedError異常 PEP 475)。

相比listen方法,它倆就好理解多了,一個是Client用于連接Server的方法,一個是Server用于接收Client的連接申請的方法。

但事實上accept方法一次只能接收一個Client的連接申請,而Client則是多個的,這樣Socket會設(shè)計一個隊列來存儲Client的連接申請則是理所當然的。于是accept便從這個隊列里提取首位成員處理即可。

以下是示意圖:

如此便很清晰了,backlog參數(shù)的含義便是這個隊列的最大值,也就是同時受理連接申請的最大值。關(guān)于backlog該設(shè)置為多少,從Skynet得到的參考為32。如果滿了便需要Client重新connect。以上listen方法之謎便解開了。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • python tkinter實現(xiàn)界面切換的示例代碼

    python tkinter實現(xiàn)界面切換的示例代碼

    今天小編就為大家分享一篇python tkinter實現(xiàn)界面切換的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 基于Python繪制美觀動態(tài)圓環(huán)圖、餅圖

    基于Python繪制美觀動態(tài)圓環(huán)圖、餅圖

    這篇文章主要介紹了基于Python制作美觀動態(tài)圓環(huán)圖、餅圖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-06-06
  • 使用PyTorch實現(xiàn)手寫數(shù)字識別功能

    使用PyTorch實現(xiàn)手寫數(shù)字識別功能

    在人工智能的世界里,計算機視覺是最具魅力的領(lǐng)域之一,通過PyTorch這一強大的深度學(xué)習框架,我們將在經(jīng)典的MNIST數(shù)據(jù)集上,見證一個神經(jīng)網(wǎng)絡(luò)從零開始學(xué)會識別數(shù)字的全過程,本文給大家介紹了如何使用PyTorch實現(xiàn)手寫數(shù)字識別,需要的朋友可以參考下
    2025-03-03
  • Python re正則表達式元字符分組()用法分享

    Python re正則表達式元字符分組()用法分享

    在本篇文章里小編給大家整理了關(guān)于Python re正則表達式元字符分組()的相關(guān)知識點實例,需要的朋友們可以學(xué)習下。
    2020-02-02
  • 安裝ElasticSearch搜索工具并配置Python驅(qū)動的方法

    安裝ElasticSearch搜索工具并配置Python驅(qū)動的方法

    這篇文章主要介紹了安裝ElasticSearch搜索工具并配置Python驅(qū)動的方法,文中還介紹了其與Kibana數(shù)據(jù)顯示客戶端的配合使用,需要的朋友可以參考下
    2015-12-12
  • python小程序基于Jupyter實現(xiàn)天氣查詢的方法

    python小程序基于Jupyter實現(xiàn)天氣查詢的方法

    這篇文章主要介紹了python小程序基于Jupyter實現(xiàn)天氣查詢的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-03-03
  • 僅利用30行Python代碼來展示X算法

    僅利用30行Python代碼來展示X算法

    這篇文章主要介紹了僅利用30行Python代碼來展示X算法,同時還有對算法實現(xiàn)的復(fù)雜度的說明,需要的朋友可以參考下
    2015-04-04
  • Python?Django教程之實現(xiàn)新聞應(yīng)用程序

    Python?Django教程之實現(xiàn)新聞應(yīng)用程序

    Django是一個用Python編寫的高級框架,它允許我們創(chuàng)建服務(wù)器端Web應(yīng)用程序。在本文中,我們將了解如何使用Django創(chuàng)建新聞應(yīng)用程序,感興趣的可以嘗試一下
    2022-10-10
  • python?使用enumerate()函數(shù)詳解

    python?使用enumerate()函數(shù)詳解

    enumerate()是python的內(nèi)置函數(shù),將一個可遍歷iterable數(shù)據(jù)對象,組合為一個索引序列,同時列出數(shù)據(jù)和數(shù)據(jù)下標,一般用在for循環(huán)當中,這篇文章主要介紹了python?使用enumerate()函數(shù),需要的朋友可以參考下
    2022-11-11
  • Python猜數(shù)字算法題詳解

    Python猜數(shù)字算法題詳解

    在本篇文章里小編給大家整理的是關(guān)于Python猜數(shù)字算法題詳解內(nèi)容,有興趣的朋友們可以學(xué)習下。
    2020-03-03

最新評論

永靖县| 毕节市| 玉环县| 边坝县| 海丰县| 白银市| 太湖县| 甘孜| 枞阳县| 南澳县| 黑河市| 瑞丽市| 湟源县| 华阴市| 庐江县| 沙河市| 临洮县| 张家口市| 莫力| 竹北市| 遵义市| 武清区| 三门峡市| 永宁县| 铅山县| 台山市| 龙游县| 新巴尔虎右旗| 集安市| 昭苏县| 湖口县| 汉寿县| 西青区| 台南市| 陇南市| 曲水县| 河津市| 安图县| 昭通市| 新竹县| 高要市|