Przerwanie blokującej funkcji socket.recv()

0

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ść?

0

Może to: http://www.sfentona.net/?p=2239 coś pomoże. Czat na socketach i wątkach

1

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$ 
0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1