首先,我沒有任何錯誤或錯誤,我問這個問題是為了了解更多。我想通過從客戶端到服務器的單獨連接同時發送多個檔案。我使用執行緒使客戶端的發送程序并發。聽起來它確實提高了一點吞吐量。但我還是很困惑。下面是我的服務器和客戶端代碼。我不知道使用執行緒如何使這個行程并發,因為服務器端的套接字有一個佇列,并且佇列中的所有資料無論是輪流發送還是并發發送。誰能給我解釋一下?或者如果我錯了或者我的代碼不能并發發送,請告訴我!謝謝。
服務器.py
def rcv_thread(self, conn):
context = ''
while True:
try:
recvfile = conn.recv(4096)
context = recvfile.decode()
except Exception:
if context == '':
return
break
/////////
conn.close()
def receive(self):
self.t = time.time()
while True:
c, addr = self.socket.accept()
c.settimeout(2)
start_new_thread(self.rcv_thread,(c,))
客戶端.py
def transfer_file(self, file_name):
path = self.path "/" file_name
sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sckt.connect((self.HOST, self.PORT))
file = open(path, 'rb')
context = file.read()
sckt.sendall((file_name "##" context.decode()).encode())
sckt.close()
def run(self):
self.start_time = time.time()
files = os.listdir(self.path)
num_of_iterates = int(len(files) / self.concurrency)
for j in range(num_of_iterates 1):
min_iter = min(self.concurrency, len(files) - j * self.concurrency)
for i in range(min_iter):
th = threading.Thread(target=self.transfer_file, args={files[j * self.concurrency i]})
th.start()
self.connection_threads.append(th)
for i in range(min_iter):
self.connection_threads[i].join()
uj5u.com熱心網友回復:
服務器端的socket有一個佇列,所有的資料不管是輪流發送還是并發發送,都存放在佇列中。
這里涉及多個套接字而不是一個。在服務器端有一個偵聽器套接字,它在 上回傳一個新的連接套接字accept。類似在客戶端上使用多個套接字。這導致客戶端和服務器之間存在多個 TCP 連接,每個連接都有自己的發送和接收緩沖區和獨立的流量控制。
鑒于 TCP 連接從一個傳輸中資料的小視窗開始,然后緩慢地增加視窗,通過并行使用多個短期 TCP 連接而不是多個短期 TCP 連接一個接一個,可以更好地利用可用帶寬. 盡管只有幾個長期存在的 TCP 連接并通過這些連接傳輸多個檔案,但效率更高。
除了網路流量之外,還有其他因素可以在使用多執行緒時提高性能。一方面,它更好地利用了當今 CPU 中的多核。然后對于每次傳輸,從磁盤讀取一個檔案,這也增加了延遲 - 對于慢速磁盤,延遲更多。并行打開和讀取多個檔案比按順序執行要快得多,因為底層作業系統能夠并行運行多個磁盤操作并優化磁盤訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387188.html
標籤:Python 多线程 插座 联网 python-多线程
上一篇:使用javascript禁用按鈕
下一篇:保留IP和主機名串列
