首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提高通过套接字发送多个文件的吞吐量

提高通过套接字发送多个文件的吞吐量
EN

Stack Overflow用户
提问于 2021-12-20 03:41:22
回答 2查看 111关注 0票数 0

首先,我没有任何错误或错误,我问这个问题,以了解更多。我希望通过与客户端连接到服务器的单独连接并发发送多个文件。我使用线程使发送进程在客户端并发。听起来确实能提高吞吐量。但我还是很困惑。下面是我的服务器和客户端代码。我不知道使用线程如何使这个进程并发,因为服务器端的套接字有一个队列,所有数据存储在队列中,无论它们是依次发送还是并发发送。有人能给我解释一下吗?或者如果我错了,或者我的代码不能同时发送,请告诉我!谢谢。

server.py

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
    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()
EN

Stack Overflow用户

回答已采纳

发布于 2021-12-20 06:57:59

服务器端的套接字有一个队列,所有数据存储在队列中,无论它们是依次发送还是并发发送。

这里涉及多个套接字,而不是一个套接字。在服务器端,有一个监听器套接字,它在accept上返回一个新连接的套接字。在客户端上使用多个套接字。这将导致客户机和服务器之间的多个TCP连接,每个连接都有自己的发送和接收缓冲区以及独立的流控制。

考虑到TCP连接从一个小的飞行数据窗口开始,然后缓慢地向上倾斜,人们可以更好地利用可用的带宽,方法是并行地拥有许多短命的TCP连接,而不是在彼此之后拥有多个短命的TCP连接。但是,如果只使用几个长期存在的TCP连接,并在这些连接上传输多个文件,效率就会更高。

除了网络流量之外,在使用多个线程时还有其他因素会带来更高的性能。首先,它更好地利用了当今CPU中的多个核心。然后,对于每次传输,一个文件从磁盘读取,这也增加了一个延迟-更多的慢磁盘延迟。并行地打开和读取多个文件比按顺序打开和读取多个文件要快得多,因为底层操作系统能够并行运行多个磁盘操作并优化磁盘访问。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70417178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档