Python Multithreading, ejecuta dos funciones al mismo tiempo

Así que estoy aprendiendo sobre programación de sockets y he escrito un ingenioso servidor de chat. El problema que tengo es que mi cliente no puede leer y escribir al mismo tiempo. No estoy muy seguro de cómo configurar esto.

Esto es lo que tengo hasta ahora, quiero que read() y write() se ejecuten simultáneamente (no se trata tanto de leer y escribir al mismo tiempo, se trata de poder recibir mensajes mientras input() se cuelga esperando para la entrada del usuario.):

import socket 
import threading

class Client(threading.Thread):

    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(('127.0.0.1', 1234))
        print('Client connected to server')

        self.readThread = threading.Thread.__init__(self)
        self.writeThread = threading.Thread.__init__(self)

    def read(self):
        data = self.socket.recv(1024)
        if data:
            print('Received:', data)

    def write(self):
        message = input()
        self.socket.send(bytes(message, 'utf-8'))


client = Client()

while True:
    #do both

preguntado el 28 de julio de 12 a las 03:07

Vas a querer crear dos objetos de enhebrado separados para reading y writeEn g. Si la implementación de su socket no es segura para subprocesos, tendrá que agregar una primitiva de bloqueo o tal vez un sistema que ponga en cola las solicitudes de lectura y escritura en el socket. O simplemente podría usar dos enchufes, uno para leer y otro para escribir. -

Gracias por responder. No se trata tanto de leer y escribir al mismo tiempo, se trata de poder recibir mensajes mientras input() se cuelga esperando la entrada del usuario. ¿Pensamientos? -

Desde el documentos, aparece socket tiene un modo sin bloqueo. Enhebrar puede ser innecesario. -

1 Respuestas

Estás muy cerca. Prueba algo como esto:

import socket 
import threading

class Client(threading.Thread):

    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(('127.0.0.1', 1234))
        print('Client connected to server')

        t = threading.Thread(target = self.read)
        t.daemon = True # helpful if you want it to die automatically
        t.start()

        t2 = threading.thread(target = self.write)
        t2.daemon = True
        t2.start()

    def read(self):
        while True:
            data = self.socket.recv(1024)
            if data:
                print('Received:', data)

    def write(self):
        while True:
            message = input()
            self.socket.send(bytes(message, 'utf-8'))


client = Client()

Vale la pena señalar que si está leyendo y escribiendo desde una sola terminal de esta manera, su aviso podría salirse un poco de control. Sin embargo, me imagino que está comenzando con declaraciones de impresión, pero eventualmente recopilará datos en otros contenedores en su aplicación.

Respondido 28 Jul 12, 05:07

¡Gracias! Solo estaba ejecutando read() y write() una vez con daemon = True, ¡pero sin él funciona! - putt putt

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.