python多進程socket
『壹』 python之多線程
進程的概念:以一個整體的形式暴露給操作系統管理,裡麵包含各種資源的調用。 對各種資源管理的集合就可以稱為進程。
線程的概念:是操作系統能夠進行運算調度的最小單位。本質上就是一串指令的集合。
進程和線程的區別:
1、線程共享內存空間,進程有獨立的內存空間。
2、線程啟動速度快,進程啟動速度慢。注意:二者的運行速度是無法比較的。
3、線程是執行的指令集,進程是資源的集合
4、兩個子進程之間數據不共享,完全獨立。同一個進程下的線程共享同一份數據。
5、創建新的線程很簡單,創建新的進程需要對他的父進程進行一次克隆。
6、一個線程可以操作(控制)同一進程里的其他線程,但是進程只能操作子進程
7、同一個進程的線程可以直接交流,兩個進程想要通信,必須通過一個中間代理來實現。
8、對於線程的修改,可能會影響到其他線程的行為。但是對於父進程的修改不會影響到子進程。
第一個程序,使用循環來創建線程,但是這個程序中一共有51個線程,我們創建了50個線程,但是還有一個程序本身的線程,是主線程。這51個線程是並行的。注意:這個程序中是主線程啟動了子線程。
相比上個程序,這個程序多了一步計算時間,但是我們觀察結果會發現,程序顯示的執行時間只有0.007秒,這是因為最後一個print函數它存在於主線程,而整個程序主線程和所有子線程是並行的,那麼可想而知,在子線程還沒有執行完畢的時候print函數就已經執行了,總的來說,這個時間只是執行了一個線程也就是主線程所用的時間。
接下來這個程序,吸取了上面這個程序的缺點,創建了一個列表,把所有的線程實例都存進去,然後使用一個for循環依次對線程實例調用join方法,這樣就可以使得主線程等待所創建的所有子線程執行完畢才能往下走。 注意實驗結果:和兩個線程的結果都是兩秒多一點
注意觀察實驗結果,並沒有執行列印task has done,並且程序執行時間極其短。
這是因為在主線程啟動子線程前把子線程設置為守護線程。
只要主線程執行完畢,不管子線程是否執行完畢,就結束。但是會等待非守護線程執行完畢
主線程退出,守護線程全部強制退出。皇帝死了,僕人也跟著殉葬
應用的場景 : socket-server
注意:gil只是為了減低程序開發復雜度。但是在2.幾的版本上,需要加用戶態的鎖(gil的缺陷)而在3點幾的版本上,加鎖不加鎖都一樣。
下面這個程序是一個典型的生產者消費者模型。
生產者消費者模型是經典的在開發架構中使用的模型
運維中的集群就是生產者消費者模型,生活中很多都是
那麼,多線程的使用場景是什麼?
python中的多線程實質上是對上下文的不斷切換,可以說是假的多線程。而我們知道,io操作不佔用cpu,計算佔用cpu,那麼python的多線程適合io操作密集的任務,比如socket-server,那麼cpu密集型的任務,python怎麼處理?python可以折中的利用計算機的多核:啟動八個進程,每個進程有一個線程。這樣就可以利用多進程解決多核問題。
『貳』 python如何提高socket速率
python如何提高socket速率,方法如下:
1、使用非阻塞模式:使用socket的setblocking函數可以將socket設置為非阻塞模式,這樣可以避免socket處於等待狀態,從而提高速度。
2、使用多線程和多進程:利用多線程和多進程可以同時處理多個socket連接,從而提高socket速率。
3、減少數據傳輸:減少socket發送數據量,可以減少消息傳輸時間,從而提高socket速度。
4、調整TCP參數:可以通過調整網路參數,如TCP緩沖區大小,TCP超時時間等等,來提高socket速度。
Python是一種計算機編程語言,它簡單易學,功能強大,可以用來做日常任務,也可以用來開發復雜的軟體和應用程序。它的語法簡潔,易於理解,可以大大減少開發時間,節約開發費用。
『叄』 如何使用python的multiprocess多進程
#!/usr/bin/env python
# encoding: utf-8
from multiprocessing.mmy import Pool as ThreadPool
import socket
import time
def scan(port):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(0.1)
ip='220.181.136.241'
#print port
try:
s.connect((ip,port))
#print port
except:
pass
else:
print 'port is %s',port
s.close()
port=range(10000)
pool=ThreadPool(60)
start=time.time()
results=pool.map(scan,port)
#print results
pool.close()
pool.join()
print time.time()-start
『肆』 同步socket, 非同步socket, 多線程socket, 多進程socket
socket常用,本文立足同步和非同步socket,以及現有的socketserver庫。
同步socket一般有利用socket庫直接,就可以寫出tcp或udp的套接字
socketserver提供的線程或進程方式的socket
利用python 3.5+的asyncio協議,封裝一個協程的socket server ,普通的socket客戶也可以連接。
伺服器端
客戶端
為位元組流加上自定義固定長度報頭,報頭中包含位元組流長度,然後一次send到對端,對端在接收時,先從緩存中取出定長的報頭,然後再取真實數據
構造報頭信息
服務端
客戶端
粘包,分包都tcp
tcp為什麼會有粘包分包這些情況:
1.服務端處理不過來
2.客戶端採用優化納格爾演算法,達到一定位元組才發
怎麼處理:
1. 客,服雙方確定包頭規范,根據包頭的信息取包長度
2. 客戶端發送帶上標記位,如\n, 服務端根據標記取包
伺服器端
客戶端
伺服器端
客戶端
伺服器端
客戶端
封裝了socket,而且解決了Io阻塞問題
服務端
客戶端
客戶端
參考:
http://www.cnblogs.com/jokerbj/p/7422349.html
http://xiaorui.cc/2016/03/08/%E8%A7%A3%E5%86%B3golang%E5%BC%80%E5%8F%91socket%E6%9C%8D%E5%8A%A1%E6%97%B6%E7%B2%98%E5%8C%85%E5%8D%8A%E5%8C%85bug/
http://xiaorui.cc/2016/04/15/%E6%89%93%E9%80%A0mvc%E6%A1%86%E6%9E%B6%E4%B9%8Bsocket%E8%8E%B7%E5%8F%96http%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98/
https://www.jianshu.com/p/065c53cab328
https://mozillazg.com/2017/08/python-asyncio-note-io-protocol.html#hidid3
『伍』 python 多線程和多進程的區別 mutiprocessing theading
在socketserver服務端代碼中有這么一句:
server = socketserver.ThreadingTCPServer((ip,port), MyServer)
ThreadingTCPServer這個類是一個支持多線程和TCP協議的socketserver,它的繼承關系是這樣的:
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
右邊的TCPServer實際上是主要的功能父類,而左邊的ThreadingMixIn則是實現了多線程的類,ThreadingTCPServer自己本身則沒有任何代碼。
MixIn在Python的類命名中很常見,稱作「混入」,戲稱「亂入」,通常為了某種重要功能被子類繼承。
我們看看一下ThreadingMixIn的源代碼:
class ThreadingMixIn:
daemon_threads = False
def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
self.shutdown_request(request)
except:
self.handle_error(request, client_address)
self.shutdown_request(request)
def process_request(self, request, client_address):
t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
t.daemon = self.daemon_threads
t.start()
在ThreadingMixIn類中,其實就定義了一個屬性,兩個方法。其中的process_request()方法實際調用的正是Python內置的多線程模塊threading。這個模塊是Python中所有多線程的基礎,socketserver本質上也是利用了這個模塊。
socketserver通過threading模塊,實現了多線程任務處理能力,可以同時為多個客戶提供服務。
那麼,什麼是線程,什麼是進程?
進程是程序(軟體,應用)的一個執行實例,每個運行中的程序,可以同時創建多個進程,但至少要有一個。每個進程都提供執行程序所需的所有資源,都有一個虛擬的地址空間、可執行的代碼、操作系統的介面、安全的上下文(記錄啟動該進程的用戶和許可權等等)、唯一的進程ID、環境變數、優先順序類、最小和最大的工作空間(內存空間)。進程可以包含線程,並且每個進程必須有至少一個線程。每個進程啟動時都會最先產生一個線程,即主線程,然後主線程會再創建其他的子線程。
線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不獨立擁有系統資源,但它可與同屬一個進程的其它線程共享該進程所擁有的全部資源。每一個應用程序都至少有一個進程和一個線程。在單個程序中同時運行多個線程完成不同的被劃分成一塊一塊的工作,稱為多線程。
舉個例子,某公司要生產一種產品,於是在生產基地建設了很多廠房,每個廠房內又有多條流水生產線。所有廠房配合將整個產品生產出來,單個廠房內的流水線負責生產所屬廠房的產品部件,每個廠房都擁有自己的材料庫,廠房內的生產線共享這些材料。公司要實現生產必須擁有至少一個廠房一條生產線。換成計算機的概念,那麼這家公司就是應用程序,廠房就是應用程序的進程,生產線就是某個進程的一個線程。
線程的特點:
線程是一個execution context(執行上下文),即一個cpu執行時所需要的一串指令。假設你正在讀一本書,沒有讀完,你想休息一下,但是你想在回來時繼續先前的進度。有一個方法就是記下頁數、行數與字數這三個數值,這些數值就是execution context。如果你的室友在你休息的時候,使用相同的方法讀這本書。你和她只需要這三個數字記下來就可以在交替的時間共同閱讀這本書了。
線程的工作方式與此類似。CPU會給你一個在同一時間能夠做多個運算的幻覺,實際上它在每個運算上只花了極少的時間,本質上CPU同一時刻只能幹一件事,所謂的多線程和並發處理只是假象。CPU能這樣做是因為它有每個任務的execution context,就像你能夠和你朋友共享同一本書一樣。
進程與線程區別:
同一個進程中的線程共享同一內存空間,但進程之間的內存空間是獨立的。
同一個進程中的所有線程的數據是共享的,但進程之間的數據是獨立的。
對主線程的修改可能會影響其他線程的行為,但是父進程的修改(除了刪除以外)不會影響其他子進程。
線程是一個上下文的執行指令,而進程則是與運算相關的一簇資源。
同一個進程的線程之間可以直接通信,但是進程之間的交流需要藉助中間代理來實現。
創建新的線程很容易,但是創建新的進程需要對父進程做一次復制。
一個線程可以操作同一進程的其他線程,但是進程只能操作其子進程。
線程啟動速度快,進程啟動速度慢(但是兩者運行速度沒有可比性)。
由於現代cpu已經進入多核時代,並且主頻也相對以往大幅提升,多線程和多進程編程已經成為主流。Python全面支持多線程和多進程編程,同時還支持協程。
『陸』 python socket編程
通過python的網路通信支持,通過網路模塊,python程序可以非常方便地相互訪問互聯網上的HTTP服務和FTP服務等。可以直接獲取互聯網上的遠程資源,還可以向遠程資源發送GET POST請求。
計算機網路是線代通信技術與計算機技術相結合的產物,計算機網路主要可以提供
通信協議一般由三部分組成:一是語義部分,用於決定雙襪昌方對話類型;二是語法部分,用於決定雙方對話的格式;三是變化規則,用於決定通信雙方的應答關系。
應用層:與其它計算機進行通訊的一個應用,它是對應應用程序的通信服務的。有HTTP, FTP , NFS, SMTP, TELNET
表示層:這一層主要是定義數據格式及加密。如加密, ASCII
會話層:它定義了如何開始、控制和結束一個會話,包括對多個雙向消息的控制和管理,以便在只完成連續消息的一部分時可以通知應用,從而使表示層看到的數據是連續的。如 RPC,SQL
傳輸層:這層的功能包括是否選擇差錯恢復協議還是無差錯恢復協議,及在泳衣主機上對不同應用的數據流的輸入進行復用,還包括對收到的順序不對的數據包的重新排序功能,如 TCP UDP SPX
網路層:這層對端對端的包傳輸進行定義,它定義了能夠標猜好散識所有結點的邏輯地址,還定義了路由實現的方式和學習的方式。如IP
數據鏈路層:它定義了在單個鏈路上如何傳輸數據。這些協議與被討論的各種介質有關
物理層:OSI的物理層規范是有關傳輸介質的特性,這些規范通常也參考了其他組織制定的標准。
IP地址用於唯一標識網路中的一個通信實體,這個通信實體既可以是一個主機,也可以是路由器的某個埠,。而在基於IP協議的網路中傳輸數據包都必須使用IP地址來進行標識。
埠,程序與外界進行交互的出入口。
Tcp/IP通信協議是一種可靠的網路協議,他在通信的兩端建立一個socket,從而形成虛擬的網路鏈路。一旦建立了虛擬網路鏈路,兩端的程穗氏序就可以通過該鏈路進行通信。
IP 是Internet上使用的一個關鍵協議,通過IP協議,使internet成為一個允許連接不同類型的計算機和不同操作系統的網路。同時還需要TCP協議來提供可靠且無差錯的服務。
TCP協議被稱為端對端協議,這是因為他在兩台計算機的連接中起了非常重要的角色,當一台計算機需要與另外一台計算機連接時,TCP協議會讓他們之間建立一個虛擬鏈路,用於發送和接受數據。
TCP協議負責收集這些數據包,並將其按照適當的順序傳送,接收端收到數據包後將其正確的還原。TCP保證數據包在傳送過程中准確無誤。TCP協議採用重發機制,當一個通信實體發送一個消息給另外一個通信實體後,需要接收到另外一個通信實體的確認信息,如果沒有接收到該確認信息,則會重發信息。
使用socket之前,必須先創建socket對象,可通過該類的構造器來創建socket實例。
socket.socket(family = AF_INET, type= SOCK_STREAM, proto=0, fileno= None)
socket對象常用的方法:
基本步驟
創建客戶端的步驟:
小實例:服務端
客戶端:
通過這樣就可以實現socket之間的通信。
『柒』 Python多線程,多進程不能同時執行
進程(process)和線程(thread)是操薯激作系統的基本概念,但是它們比較抽象,不容易掌握。關於多進程和多線程,教仿閉科書上最經典的一句話是「進程是資源分配的最小單位,線程數大襪是CPU調度的最小單位」。 線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
『捌』 求大神 幫忙 在 windos 下寫 python socket 伺服器。多線程高並發的,3000以上。python2.7 的環境。
多線程高並發不容易。因為python的線程雖然是真線程,不過它有GIL。 所以通常會使用twisted工具,高並發就不是難題了。在linux下更容易。
由於windows下不知道socket的復制。所以不能使用多進猛虧岩程管理多個python實例處理一個埠的請求。
所以建議你走另外一條路,使用nginx之類的代理,再通過wsgi連接。枝御
另外一種辦法是使用jython, 這是沒有GIL鎖的。
不過話說回來,高並發並空察不取決於語言快慢。而在於處理請求的快慢。 如果你的請求處理速度極快,即使10個線程也可以高並發到3000以上。甚至8000都可以做到。
『玖』 python socketserver和socket的區別
區別:
1.首先介紹下socket
socket的英文原義是「孔」或「插座」。作為BSD UNIX的進程通信機制,取後一種意思。通常也
稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一 般運行了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個埠上,不同的埠對應於不同的服務。Socket正如其英文原 意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務
內部調用流程為:
啟動服務端程序
執行 TCPServer.init方法,創建服務端Socket對象並綁定 IP 和 埠
執行 BaseServer.init方法,將自定義的繼承自SocketServer.BaseRequestHandler 的類 - MyRequestHandle賦值給 self.RequestHandlerClass
執行 BaseServer.server_forever 方法,While 循環一直監聽是否有客戶端請求到達 ...
當客戶端連接到達伺服器
執行 ThreadingMixIn.process_request 方法,創建一個 「線程」 用來處理請求
執行 ThreadingMixIn.process_request_thread 方法
執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)
ForkingTCPServer
ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 「線程」 和 「進程」。
『拾』 pythonsocket服務端響應多個返回
創建 socket 對象,監聽地址
while True: serversocket.accept() 不斷接收請求
conn 其實就是 socket 對象,接受到請求之後,conn.recv(1024) 不斷拼配告接出 request,然後解析 request
conn.send(response), conn.close() 響應請求,關掉
能同時棗賣畢響應多個請求是因為把 handler 部分新增線程來處理
在 socket.accept() 之後,把凳芹 handle_connection() 放到線程處理。