Tengo un hilo principal que espera la conexión. Genera hilos de clientes que harán eco de la respuesta del cliente (telnet en este caso). Pero diga que quiero cerrar todos los sockets y todos los hilos después de un tiempo, como después de 1 conexión. ¿Cómo lo haría? Si hago clientSocket.close() desde el hilo principal, no dejará de hacer el recv. Solo se detendrá si primero envío algo a través de telnet, luego fallará haciendo más envíos y recvs.Cómo cancelo un socket.recv() desde otro hilo en Python
Mi mirada código como este:
# Echo server program
import socket
from threading import Thread
import time
class ClientThread(Thread):
def __init__(self, clientSocket):
Thread.__init__(self)
self.clientSocket = clientSocket
def run(self):
while 1:
try:
# It will hang here, even if I do close on the socket
data = self.clientSocket.recv(1024)
print "Got data: ", data
self.clientSocket.send(data)
except:
break
self.clientSocket.close()
HOST = ''
PORT = 6000
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serverSocket.bind((HOST, PORT))
serverSocket.listen(1)
clientSocket, addr = serverSocket.accept()
print 'Got a new connection from: ', addr
clientThread = ClientThread(clientSocket)
clientThread.start()
time.sleep(1)
# This won't make the recv in the clientThread to stop immediately,
# nor will it generate an exception
clientSocket.close()
No puede hacerlo con subprocesos ya que CPython tiene el bloqueo de Intérprete global. http://docs.python.org/c-api/init.html#threads – badp