2011-09-08 15 views
7

Domanda: Esiste una sorta di timeout o interruzione della funzione socket.accept() in python?oggetto socket python accetta timeout


Info:

Ho un programma che ha un thread figlio associato a una porta e costantemente accettare e tende e li passa a una coda per il thread principale. In questo momento sto cercando di interrompere il thread figlio in modo che possa decostruire in modo appropriato. Penso che sia possibile semplicemente interrompere il thread figlio e fare in modo che il genitore decostruisca il bambino, ma ci sono altre volte in cui voglio essere in grado di restituire il modulo iniziale, quindi ho deciso che sarebbe stato l'approccio più utile.

Quindi, c'è un modo per ottenere un timeout o annullare il metodo accept in modo che il thread possa tornare senza che sia necessario connettersi prima ad esso?

risposta

8

È possibile impostare il timeout predefinito con

import socket 
print socket.getdefaulttimeout() 
socket.setdefaulttimeout(60) 

AFAIK Questo influenzerà tutto l'operazione di presa

+0

lo farà? ok. quando ho letto la documentazione ha fatto sembrare che solo l'invio e la ricezione sono stati effettuati. Grazie! – Narcolapser

2

È possibile utilizzare settimeout() come in questo esempio:

import socket 

tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
tcpServer.bind(('0.0.0.0', 10000)) # IP and PORT 

stopped = False 
while not stopped: 
    try: 
    tcpServer.settimeout(0.2) # timeout for listening 
    tcpServer.listen(1) 
    (conn, (ip, port)) = tcpServer.accept() 
    except socket.timeout: 
    pass 
    except: 
    raise 
    else: 
    # work with the connection, create a thread etc. 
    ... 

Il ciclo funzionerà fino a quando stopped è impostato su true e quindi uscirà dopo (al massimo) il timeout impostato. (Nella mia applicazione passo l'handle di connessione a un thread appena creato e continuo il ciclo per essere in grado di accettare ulteriori connessioni simultanee.)