首先,我没有任何错误或错误,我问这个问题,以了解更多。我希望通过与客户端连接到服务器的单独连接并发发送多个文件。我使用线程使发送进程在客户端并发。听起来确实能提高吞吐量。但我还是很困惑。下面是我的服务器和客户端代码。我不知道使用线程如何使这个进程并发,因为服务器端的套接字有一个队列,所有数据存储在队列中,无论它们是依次发送还是并发发送。有人能给我解释一下吗?或者如果我错了,或者我的代码不能同时发送,请告诉我!谢谢。
server.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,))
client.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()
发布于 2021-12-20 06:57:59
服务器端的套接字有一个队列,所有数据存储在队列中,无论它们是依次发送还是并发发送。
这里涉及多个套接字,而不是一个套接字。在服务器端,有一个监听器套接字,它在accept
上返回一个新连接的套接字。在客户端上使用多个套接字。这将导致客户机和服务器之间的多个TCP连接,每个连接都有自己的发送和接收缓冲区以及独立的流控制。
考虑到TCP连接从一个小的飞行数据窗口开始,然后缓慢地向上倾斜,人们可以更好地利用可用的带宽,方法是并行地拥有许多短命的TCP连接,而不是在彼此之后拥有多个短命的TCP连接。但是,如果只使用几个长期存在的TCP连接,并在这些连接上传输多个文件,效率就会更高。
除了网络流量之外,在使用多个线程时还有其他因素会带来更高的性能。首先,它更好地利用了当今CPU中的多个核心。然后,对于每次传输,一个文件从磁盘读取,这也增加了一个延迟-更多的慢磁盘延迟。并行地打开和读取多个文件比按顺序打开和读取多个文件要快得多,因为底层操作系统能够并行运行多个磁盘操作并优化磁盘访问。
发布于 2021-12-21 18:37:17
在用Python而不是用户空间线程创建不同的线程时,您可能希望确保得到的是独立的内核线程。您可以在传输期间检查每个CPU的利用率,以确保没有一个CPU处于饱和状态。正如其他地方所建议的那样,您也可能希望在两端检查存储子系统的利用率。
如果您同时创建了许多连接,您还应该检查您的服务器系统,以确保服务器的侦听套接字没有溢出侦听队列。如果您有一个类似*nix的系统,您可以查看netstat -s的输出。
另外,除非这些是小文件,否则可以考虑接收大于4096字节的文件。
https://stackoverflow.com/questions/70417178
复制相似问题