es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

mejorar el rendimiento de envío de múltiples archivos a través de un socket

Al principio, no tengo errores ni bugs, hago esta pregunta para comprender más.
Quiero enviar varios archivos simultáneamente a un servidor desde un cliente utilizando una conexión separada. Utilicé hilos para hacer que el proceso de envío sea simultáneo en el lado del cliente. Parece que mejora un poco el rendimiento. Pero todavía estoy confundido. A continuación se muestra el código del servidor y el cliente. No sé cómo usar hilos hace que este proceso sea simultáneo, porque el socket en el lado del servidor tiene una cola y todos los datos se almacenan en la cola, ya sea que se hayan enviado en orden o simultáneamente. ¿Alguien puede explicármelo? ¿O si me equivoco o mi código no hace que el envío sea simultáneo, por favor avísenme! Gracias.

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()
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El uso de hilos en el código del lado del cliente hace que el proceso de transferencia de archivos sea concurrente. Cada hilo es responsable de enviar un archivo separado, lo que permite transferir varios archivos simultáneamente.

    Sin embargo, en el lado del servidor, los datos recibidos pueden ser encolados, pero no se garantiza que el orden de los datos sea el mismo en el que se enviaron. Esto se debe a que la transferencia de datos a través de una red no es determinista y puede verse afectada por factores como la congestión de la red y la latencia.

    En general, el uso de hilos en el código del lado del cliente mejora el rendimiento del proceso de transferencia de archivos, pero es posible que sea necesario actualizar el código del lado del servidor para manejar los datos recibidos en un orden no secuencial.

Comments are closed.