Witam,
chciałbym przerwać blokującą metodę socket.recv() (wątek połączenia z klientem) z poza tego wątku. Chciałbym uniknąć też stosowania metody socket.setblocking(0). Jest w ogóle taka możliwość?
Witam,
chciałbym przerwać blokującą metodę socket.recv() (wątek połączenia z klientem) z poza tego wątku. Chciałbym uniknąć też stosowania metody socket.setblocking(0). Jest w ogóle taka możliwość?
Może to: http://www.sfentona.net/?p=2239 coś pomoże. Czat na socketach i wątkach
Możesz wysłać sygnał do programu, program wyskoczy z IO i możesz go obsłużyć aby program się nie zamknął. Oczywiście jest to bardzo krzywe dlaczego potrzebujesz czegoś takiego? Może po prostu użyj select.
import socket
import signal
sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 1234)
sckt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sckt.bind(server_address)
sckt.listen(1)
print "Listening"
connection, address = sckt.accept()
print "Got connection"
def handle_signal(signum, frame):
print "Blocking interrupted"
signal.signal(signal.SIGUSR1, handle_signal)
try:
connection.recv(1024)
except socket.error:
print "socket interrupted"
print "exiting"
grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$ python signal_socket.py &
[1] 3403
grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$ Listening
grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$
grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$ nc 127.0.0.1 1234 &
[2] 3530
grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$ Got connection
grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$ kill -10 3403
Blocking interrupted
socket interrupted
exiting
[2]+ Zatrzymano nc 127.0.0.1 1234
grzegorz@grzegorz-GA-78LMT-USB3:~/tmp$
Pogrzebałem nieco w sieci na temat sygnałów i pomyślnie udało się wysłać sygnał do właściwego procesu, pomogłem sobie jeszcze tym: https://pymotw.com/2/signal/#signals-and-threads
Dziękuję za pomoc, temat do zamknięcia.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.