❶ python整數類型在每一台計算機上的取值范圍是一樣的嗎
不是一樣的。
Python的整數類型與其它語言表示的整數類型不太相同,其它語言整型的取值范圍與機器位數有關。
例如,在32位機器上,整型的取值范圍約是-2^31到2^31,在64位的機器上整型的取值范圍約是-2^63到2^63。
而Python的整型能表示的數值僅與機器支持的內存大小有關,也就是說Pyhton可以表示很大的數,可以超過機器位數所能表示的數值范圍。
(1)python大數庫擴展閱讀
Python 特點
1、易於學習:Python有相對較少的關鍵字,結構簡單,和一個明確定義的語法,學習起來更加簡單。
2、易於閱讀:Python代碼定義的更清晰。
3、易於維護:Python的成功在於它的源代碼是相當容易維護的。
4、一個廣泛的標准庫:Python的最大的優勢之一是豐富的庫,跨平台的,在UNIX,Windows和Macintosh兼容很好。
5、互動模式:互動模式的支持,可以從終端輸入執行代碼並獲得結果的語言,互動的測試和調試代碼片斷。
6、可移植:基於其開放源代碼的特性,Python已經被移植(也就是使其工作)到許多平台。
7、可擴展:如果需要一段運行很快的關鍵代碼,或者是想要編寫一些不願開放的演算法,可以使用C或C++完成那部分程序,然後從Python程序中調用。
8、資料庫:Python提供所有主要的商業資料庫的介面。
9、GUI編程:Python支持GUI可以創建和移植到許多系統調用。
10、可嵌入: 可以將Python嵌入到C/C++程序,讓程序的用戶獲得"腳本化"的能力。
❷ linux python connect 對同一個埠可以建立多少個
如果是tcp client用同一個本地埠去連不同的兩個伺服器ip,連第二個時就會提示埠已被佔用。但伺服器的監聽埠,可以accept多次,建立多個socket;我的問題是伺服器一個埠為什麼能建立多個連敗櫻接而客戶端卻不行呢?
TCP server 可以,TCP client 也可以。一個套接字只能建立一個連接,無論對於 server 還是 client。
注意報錯消息是:
[Errno 106] (EISCONN) Transport endpoint is already connected
man 2 connect 說得很清楚了:
Generally, connection-based protocol sockets may successfully connect() only once; connectionless protocol sockets may use connect() multiple times to change their association.
就是說,TCP 套接字最多隻能調用 connect 一次。那麼,你的監聽套接字調用 connect 了幾次?
來點有意思的。
一個套接字不能連接兩次,並不代表一個本地地址不能用兩次,看!****加粗文字**加做並粗文字**
>>> import socket
>>> s = socket.socket()
# since Linux 3.9, 見 man 7 socket
>>> s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s2 = socket.socket()
>>> s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s.bind(('127.0.0.1', 12345))
>>> s2.bind(('127.0.0.1', 12345))
# 都可以使用同一本地地址來連接哦
>>> s.connect(('127.0.0.1', 80))
>>> s2.connect(('127.0.0.1', 4321))
>>> netstat -npt | grep 12345
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:4321 127.0.0.1:12345 ESTABLISHED 18284/python3
tcp 0 0 127.0.0.1:12345 127.0.0.1:4321 ESTABLISHED 4568/python3
tcp 0 0 127.0.0.1:80 127.0.0.1:12345 ESTABLISHED -
tcp 0 0 127.0.0.1:12345 127.0.0.1:80 ESTABLISHED 4568/python3
你們這些有女友的都弱爆了啦 :-(
更新:大家來玩 TCP: 一個人也可以建立 TCP 連接呢 - 依雲's Blog
2015年08月19日回答 · 2015年08月19日更新
依雲21.1k 聲望
答案對人有幫助,有參考價值1答案沒幫助,是錯誤的答案,答非所問
內核是以一個(著名的)5元信息組來標識不同的socket的:源地址、源埠、目的地址、目的埠、協議號。任何一個不同,都不叫「同一個socket」。
2015年08月20日回答
sched_yield80 聲望
答案對人有幫察胡叢助,有參考價值0答案沒幫助,是錯誤的答案,答非所問
首先,TCP鏈接是可靠的端對端的鏈接,每個TCP鏈接由4個要素組成:2組IP地址(本地和遠端),2組埠地址(本地和遠端)。其中如果需要跟埠信息綁定時,都需要調用bind函數,如果server端針對2個同樣的IP、埠組進行同樣的綁定時,第2次同樣是不成功的。
2015年08月16日回答
charliecui2.4k 聲望
答案對人有幫助,有參考價值0答案沒幫助,是錯誤的答案,答非所問
有個相關的問題: ftp的數據傳輸,伺服器會用20埠主動連接客戶端,如果兩個客戶端同時在一下載東西,那ftp 伺服器能用20埠去連接兩個ip ?(這時ftp的伺服器其實是tcp里的客戶端)
2015年08月16日回答
編輯
hyanleo163 聲望
+1
能啊,看我的實驗。
依雲 · 2015年08月19日
不管是伺服器還是客戶端,建立TCP鏈接,同一個埠都只能使用一次。
這句話其實是**錯的**!
對於TCP協議,要成功建立一個新的鏈接,需要保證新鏈接四個要素組合體的唯一性:客戶端的IP、客戶端的port、伺服器端的IP、伺服器端的port。也就是說,伺服器端的同一個IP和port,可以和同一個客戶端的多個不同埠成功建立多個TCP鏈接(與多個不同的客戶端當然也可以),只要保證【Server IP + Server Port + Client IP + Client Port】這個組合唯一不重復即可。
> netstat -a -n -p tcp |grep 9999
tcp 0 0 127.0.0.1:51113 127.0.0.1:9999 ESTABLISHED 2701/nc
tcp 0 0 127.0.0.1:51119 127.0.0.1:9999 ESTABLISHED 2752/nc
上述結果127.0.0.1:9999中9999埠成功建立兩個TCP鏈接,也就可以理解。
**客戶端**發送TCP鏈接請求的埠,也就是後續建立TCP鏈接使用的埠,所以一旦TCP鏈接建立,埠就被佔用,無法再建立第二個鏈接。
而**伺服器端**有兩類埠:偵聽埠 和 後續建立TCP鏈接的埠。其中偵聽埠只負責偵聽客戶端發送來的TCP鏈接請求,不用作建立TCP鏈接使用,一旦偵聽到有客戶端發送TCP鏈接請求,就分配一個埠(一般隨機分配,且不會重復)用於建立TCP鏈接,而不是所說的伺服器一個埠能建立多個連接。
上述描述也比較片面,客戶端如何請求及建立鏈接,伺服器端如何偵聽及是否分配新隨機埠等...應該都可以在應用層面進行控制,所以上述描述可以作為建立TCP鏈接的一種方式,僅供參考。
一些英文的參考:
How do multiple clients connect simultaneously to one port, say 80, on a server?
TCP : two different sockets sharing a port?
------------------------------------------------------------------------------------
提升linux下tcp伺服器並發連接數限制 2012-12-02 20:30:23
1、修改用戶進程可打開文件數限制
在Linux平台上,無論編寫客戶端程序還是服務端程序,在進行高並發TCP連接處理時,最高的並發數量都要受到系統對用戶單一進程同時可打開文件數量的限制(這是因為系統為每個TCP連接都要創建一個socket句柄,每個socket句柄同時也是一個文件句柄)。可使用ulimit命令查看系統允許當前用戶進程打開的文件數限制:
[speng@as4 ~]$ ulimit -n
1024
這表示當前用戶的每個進程最多允許同時打開1024個文件,這1024個文件中還得除去每個進程必然打開的標准輸入,標准輸出,標准錯誤,伺服器監聽 socket,進程間通訊的unix域socket等文件,那麼剩下的可用於客戶端socket連接的文件數就只有大概1024-10=1014個左右。也就是說預設情況下,基於Linux的通訊程序最多允許同時1014個TCP並發連接。
對於想支持更高數量的TCP並發連接的通訊處理程序,就必須修改Linux對當前用戶的進程同時打開的文件數量的軟限制(soft limit)和硬限制(hardlimit)。其中軟限制是指Linux在當前系統能夠承受的范圍內進一步限制用戶同時打開的文件數;硬限制則是根據系統硬體資源狀況(主要是系統內存)計算出來的系統最多可同時打開的文件數量。通常軟限制小於或等於硬限制。
修改上述限制的最簡單的辦法就是使用ulimit命令:
[speng@as4 ~]$ ulimit -n
上述命令中,在中指定要設置的單一進程允許打開的最大文件數。如果系統回顯類似於「Operation notpermitted」之類的話,說明上述限制修改失敗,實際上是因為在中指定的數值超過了Linux系統對該用戶打開文件數的軟限制或硬限制。因此,就需要修改Linux系統對用戶的關於打開文件數的軟限制和硬限制。
第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
speng soft nofile 10240
speng hard nofile 10240
其中speng指定了要修改哪個用戶的打開文件數限制,可用'*'號表示修改所有用戶的限制;soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即最大打開文件數(請注意軟限制值要小於或等於硬限制)。修改完後保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
這是告訴Linux在用戶完成系統登錄後,應該調用pam_limits.so模塊來設置系統對該用戶可使用的各種資源數量的最大限制(包括用戶可打開的最大文件數限制),而pam_limits.so模塊就會從/etc/security/limits.conf文件中讀取配置來設置這些限制值。修改完後保存此文件。
第三步,查看Linux系統級的最大打開文件數限制,使用如下命令:
[speng@as4 ~]$ cat /proc/sys/fs/file-max
12158
這表明這台Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)12158個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制都不應超過這個數值。通常這個系統級硬限制是Linux系統在啟動時根據系統硬體資源狀況計算出來的最佳的最大同時打開文件數限制,如果沒有特殊需要,不應該修改此限制,除非想為用戶級打開文件數限制設置超過此限制的值。修改此硬限制的方法是修改/etc/rc.local腳本,在腳本中添加如下行:
echo 22158 > /proc/sys/fs/file-max
這是讓Linux在啟動完成後強行將系統級打開文件數硬限制設置為22158。修改完後保存此文件。
完成上述步驟後重啟系統,一般情況下就可以將Linux系統對指定用戶的單一進程允許同時打開的最大文件數限制設為指定的數值。如果重啟後用 ulimit- n命令查看用戶可打開文件數限制仍然低於上述步驟中設置的最大值,這可能是因為在用戶登錄腳本/etc/profile中使用ulimit-n命令已經將用戶可同時打開的文件數做了限制。由於通過ulimit-n修改系統對用戶可同時打開文件的最大數限制時,新修改的值只能小於或等於上次ulimit-n 設置的值,因此想用此命令增大這個限制值是不可能的。所以,如果有上述問題存在,就只能去打開/etc/profile腳本文件,在文件中查找是否使用了 ulimit-n限制了用戶可同時打開的最大文件數量,如果找到,則刪除這行命令,或者將其設置的值改為合適的值,然後保存文件,用戶退出並重新登錄系統即可。
通過上述步驟,就為支持高並發TCP連接處理的通訊處理程序解除關於打開文件數量方面的系統限制。
2、修改網路內核對TCP連接的有關限制
在Linux上編寫支持高並發TCP連接的客戶端通訊處理程序時,有時會發現盡管已經解除了系統對用戶同時打開文件數的限制,但仍會出現並發TCP連接數增加到一定數量時,再也無法成功建立新的TCP連接的現象。出現這種現在的原因有多種。
第一種原因可能是因為Linux網路內核對本地埠號范圍有限制。此時,進一步分析為什麼無法建立TCP連接,會發現問題出在connect()調用返回失敗,查看系統錯誤提示消息是「Can't assign requestedaddress」。同時,如果在此時用tcpmp工具監視網路,會發現根本沒有TCP連接時客戶端發SYN包的網路流量。這些情況說明問題在於本地Linux系統內核中有限制。其實,問題的根本原因在於Linux內核的TCP/IP協議實現模塊對系統中所有的客戶端TCP連接對應的本地埠號的范圍進行了限制(例如,內核限制本地埠號的范圍為1024~32768之間)。當系統中某一時刻同時存在太多的TCP客戶端連接時,由於每個TCP客戶端連接都要佔用一個唯一的本地埠號(此埠號在系統的本地埠號范圍限制中),如果現有的TCP客戶端連接已將所有的本地埠號占滿,則此時就無法為新的TCP客戶端連接分配一個本地埠號了,因此系統會在這種情況下在connect()調用中返回失敗,並將錯誤提示消息設為「Can't assignrequested address」。有關這些控制邏輯可以查看Linux內核源代碼,以linux2.6內核為例,可以查看tcp_ipv4.c文件中如下函數:
static int tcp_v4_hash_connect(struct sock *sk)
請注意上述函數中對變數sysctl_local_port_range的訪問控制。變數sysctl_local_port_range的初始化則是在tcp.c文件中的如下函數中設置:
void __init tcp_init(void)
內核編譯時默認設置的本地埠號范圍可能太小,因此需要修改此本地埠范圍限制。
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_local_port_range = 1024 65000
這表明將系統對本地埠范圍限制設置為1024~65000之間。請注意,本地埠范圍的最小值必須大於或等於1024;而埠范圍的最大值則應小於或等於65535。修改完後保存此文件。
第二步,執行sysctl命令:
[speng@as4 ~]$ sysctl -p
如果系統沒有錯誤提示,就表明新的本地埠范圍設置成功。如果按上述埠范圍進行設置,則理論上單獨一個進程最多可以同時建立60000多個TCP客戶端連接。
第二種無法建立TCP連接的原因可能是因為Linux網路內核的IP_TABLE防火牆對最大跟蹤的TCP連接數有限制。此時程序會表現為在 connect()調用中阻塞,如同死機,如果用tcpmp工具監視網路,也會發現根本沒有TCP連接時客戶端發SYN包的網路流量。由於 IP_TABLE防火牆在內核中會對每個TCP連接的狀態進行跟蹤,跟蹤信息將會放在位於內核內存中的conntrackdatabase中,這個資料庫的大小有限,當系統中存在過多的TCP連接時,資料庫容量不足,IP_TABLE無法為新的TCP連接建立跟蹤信息,於是表現為在connect()調用中阻塞。此時就必須修改內核對最大跟蹤的TCP連接數的限制,方法同修改內核對本地埠號范圍的限制是類似的:
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_conntrack_max = 10240
這表明將系統對最大跟蹤的TCP連接數限制設置為10240。請注意,此限制值要盡量小,以節省對內核內存的佔用。
第二步,執行sysctl命令:
[speng@as4 ~]$ sysctl -p
如果系統沒有錯誤提示,就表明系統對新的最大跟蹤的TCP連接數限制修改成功。如果按上述參數進行設置,則理論上單獨一個進程最多可以同時建立10000多個TCP客戶端連接。
3、使用支持高並發網路I/O的編程技術
在Linux上編寫高並發TCP連接應用程序時,必須使用合適的網路I/O技術和I/O事件分派機制。
可用的I/O技術有同步I/O,非阻塞式同步I/O(也稱反應式I/O),以及非同步I/O。在高TCP並發的情形下,如果使用同步I/O,這會嚴重阻塞程序的運轉,除非為每個TCP連接的I/O創建一個線程。但是,過多的線程又會因系統對線程的調度造成巨大開銷。因此,在高TCP並發的情形下使用同步I /O 是不可取的,這時可以考慮使用非阻塞式同步I/O或非同步I/O。非阻塞式同步I/O的技術包括使用select(),poll(),epoll等機制。非同步I/O的技術就是使用AIO。
從I/O事件分派機制來看,使用select()是不合適的,因為它所支持的並發連接數有限(通常在1024個以內)。如果考慮性能,poll()也是不合適的,盡管它可以支持的較高的TCP並發數,但是由於其採用「輪詢」機制,當並發數較高時,其運行效率相當低,並可能存在I/O事件分派不均,導致部分 TCP連接上的I/O出現「飢餓」現象。而如果使用epoll或AIO,則沒有上述問題(早期 Linux內核的AIO技術實現是通過在內核中為每個I/O請求創建一個線程來實現的,這種實現機制在高並發TCP連接的情形下使用其實也有嚴重的性能問題。但在最新的Linux內核中,AIO的實現已經得到改進)。
綜上所述,在開發支持高並發TCP連接的Linux應用程序時,應盡量使用epoll或AIO技術來實現並發的TCP連接上的I/O控制,這將為提升程序對高並發TCP連接的支持提供有效的I/O保證。
❸ python中log_inner啥意思
python中log_inner是log表示以e為底數的對數函數符號。
在數學運算中,如果沒有計算器,對於很大的數字相乘,我們花費大量的時間計算,而且一旦出錯,就要重新計算,很是麻煩。其實對於數字相乘,不依靠靠計算器,想要准確簡單的運算的方法不是沒有,那就是對數和指數,他們解決了大數或非常的小的數相乘的繁瑣計算。而在python中,也有計算對數的方法,那就是對數函數log函數。本文將向大家介紹log函數的表述語句、參數和返回值,並以實例演示用log函數計算對數的過程。log()函數:返回 x 的自然對數。即返回以 2 為基數的 x 的對數。
Python由荷蘭數學和計算機科學研究學會的吉多·范羅蘇姆 於1990 年代初設計,作為一門叫做ABC語言的替代品。Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。Python解釋器易於擴展,可以使用C語言或C++(或者其他可以通過C調用的語言)擴展新的功能和數據類型。Python 也可用於可定製化軟體中的擴展程序語言。Python豐富的標准庫,提供了適用於各個主要系統平台的源碼或機器碼。
❹ 零基礎的人如何學習python開發
python零基礎怎麼學?如果是純新手,建議找個老師教,在掌握了基本的要點以後,可以在網上找些常式研究學習。不論裂汪是找老師教,還是自學,建議掌握明團以下一些知識點:
1、編肆槐仔程環境的安裝和使用
2、輸入輸出語句、變數、表達式的理解和使用
3、選擇結構、循環結構的理解和使用
4、列表的使用
5、文件的操作
6、函數調用的方法
7、庫的安裝和使用