#python #python-3.x #multithreading #sockets
#python #python-3.x #Многопоточность #сокеты
Вопрос:
Я запускаю этот поток демона сокета на Python 3.x. Насколько я понимаю, поток демона должен завершаться немедленно при выходе из основного потока. Однако, когда я запускаю следующий код, поток демона остается в живых. Кто-нибудь, пожалуйста, объяснит это странное поведение?
in_queue = queue.Queue()
out_queue = queue.Queue()
def server_handler():
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
conn.connect(("localhost", 18000))
# set connection to non-blocking
conn.settimeout(0)
while True:
try:
msg = conn.recv(1024)
if not msg:
break
msg = pickle.loads(msg)
in_queue.put(msg)
except socket.error:
while out_queue.qsize():
msg = out_queue.get_nowait()
pickled_msg = pickle.dumps(msg)
conn.sendall(pickled_msg)
# sleep
time.sleep(0.5)
# start thread here
threading.Thread(target = server_handler, args = (in_queue, out_queue,), daemon=True).start()
Комментарии:
1. Действительно, это должно немедленно завершиться. Вы запускаете его в python REPL? В этом случае основной поток ожидает вашего ввода. Если вы запустите это без REPL, процесс завершится, как только поток будет запущен
2. Я попытался запустить на Python IDE и VS Code, тот же результат.
3. попробуйте запустить
python3 <name_of_file>
в своей оболочке