濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么

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

熱門(mén)標(biāo)簽:房產(chǎn)電銷(xiāo)外呼系統(tǒng) 蓋州市地圖標(biāo)注 浙江電銷(xiāo)卡外呼系統(tǒng)好用嗎 地圖標(biāo)注的意義點(diǎn) 地圖標(biāo)注微信發(fā)送位置不顯示 315電話機(jī)器人廣告 地圖制圖標(biāo)注位置改變是移位嗎 上海機(jī)器人外呼系統(tǒng)哪家好 南京銷(xiāo)售外呼系統(tǒng)軟件

疑問(wèn)

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

解答

下面使用具體的代碼片段來(lái)講解:

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

以listen(1),參數(shù)設(shè)置為1進(jìn)行講解,是不是將參數(shù)設(shè)置為1后,開(kāi)啟3個(gè)客服連接就會(huì)報(bào)錯(cuò)呢?并不是!

如下圖所示:

那么問(wèn)題來(lái)了!

問(wèn)題1:

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

因?yàn)椋簂isten(n)傳入的值, n表示的是服務(wù)器拒絕(超過(guò)限制數(shù)量的)連接之前,操作系統(tǒng)可以掛起的最大連接數(shù)量。n也可以看作是"排隊(duì)的數(shù)量"

問(wèn)題2:

既然沒(méi)有報(bào)錯(cuò),為什么沒(méi)有打印用戶3的地址?

因?yàn)椋悍?wù)器正在處理用戶1和用戶2,沒(méi)有空閑去接待用戶3,所以用戶3去排隊(duì)了。

問(wèn)題3:

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

因?yàn)椋?/p>

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

總結(jié)

socket.listen(n)

簡(jiǎn)單來(lái)說(shuō),這里的nt表示socket的”排隊(duì)個(gè)數(shù)

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

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

前言

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

詳解

讓我們先來(lái)看看listen方法在Python3.6文檔說(shuō)明:

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ù)量。如果未指定,則選擇默認(rèn)的合理值。

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

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

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

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

socket.connect(address)

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

在地址連接到遠(yuǎn)程套接字。(地址的格式取決于地址系列 - 請(qǐng)參見(jiàn)上文)

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).

如果連接被信號(hào)中斷,則該方法等待直到連接完成,或者如果信號(hào)處理程序沒(méi)有引發(fā)異常并且套接字正在阻塞或者已經(jīng)阻塞,則在超時(shí)時(shí)引入socket.timeout超時(shí)。對(duì)于非阻塞套接字,如果連接被信號(hào)中斷(或由信號(hào)處理程序引發(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異常,如果連接被信號(hào)中斷,信號(hào)處理程序不引發(fā)異常,套接字阻塞或超時(shí)(參見(jiàn) 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.

接收一個(gè)連接.該socket 必須要綁定一個(gè)地址和監(jiān)聽(tīng)連接.返回值是一對(duì)(conn, 地址)其中conn是新 t4 > socket對(duì)象可用于在連接上發(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)用中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則此方法現(xiàn)在重試系統(tǒng)調(diào)用,而不是引發(fā)InterruptedError異常 PEP 475)。

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

但事實(shí)上accept方法一次只能接收一個(gè)Client的連接申請(qǐng),而Client則是多個(gè)的,這樣Socket會(huì)設(shè)計(jì)一個(gè)隊(duì)列來(lái)存儲(chǔ)Client的連接申請(qǐng)則是理所當(dāng)然的。于是accept便從這個(gè)隊(duì)列里提取首位成員處理即可。

以下是示意圖:

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

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

您可能感興趣的文章:
  • Python Socket多線程并發(fā)原理及實(shí)現(xiàn)
  • python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令
  • Python基于Socket實(shí)現(xiàn)簡(jiǎn)易多人聊天室的示例代碼
  • Python WebSocket長(zhǎng)連接心跳與短連接的示例
  • 用Python進(jìn)行websocket接口測(cè)試
  • Python使用socket模塊實(shí)現(xiàn)簡(jiǎn)單tcp通信
  • python Socket網(wǎng)絡(luò)編程實(shí)現(xiàn)C/S模式和P2P
  • Python基礎(chǔ)之Socket通信原理

標(biāo)簽:金華 克拉瑪依 臨汾 赤峰 日照 陽(yáng)泉 貴州 雙鴨山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么》,本文關(guān)鍵詞  Python,聊聊,socket,中的,listen,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    金秀| 那坡县| 盐边县| 图木舒克市| 会理县| 通许县| 新巴尔虎右旗| 江都市| 罗平县| 阿拉善盟| 屏东县| 高邮市| 海城市| 盘锦市| 义乌市| 自贡市| 左云县| 卢湾区| 逊克县| 乐业县| 友谊县| 清远市| 齐河县| 广东省| 聊城市| 乌恰县| 吴旗县| 长岭县| 年辖:市辖区| 北京市| 九龙县| 长沙市| 城步| 巩义市| 平度市| 噶尔县| 吉首市| 运城市| 德安县| 奇台县| 长顺县|