Форум сайта python.su
Я не знаю куда обратиться и поэтому пишу сюда.
Когда нажимаю кнопку stop используя модуль threading, то Pycharm не останавливает и не убивает процесс, и только со второго клика все останавливается. Может быть он убивает главный процесс и остается тот, что был создан с помощью threading. По этой причине я указал что он daemon, но эффекта не возымело. Что происходит с pycharm почему не может завершить работу по нажатию одной кнопки stop? Вот этот самый код в котором возникает ошибка. Клиент и сервер. Но важно лишь то, что модуль threading очень странно действует на pycharm.
Сервер
import threading import socket import pickle def thr(sock): while 1: msg = sock.recv(1024) msg = pickle.loads(msg) print(msg) server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("127.0.0.1", 63900)) server.listen() while 1: sock, addr = server.accept() threading.Thread(target=thr, args=(sock, ), daemon=True).start()
import socket import pickle client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", 63900)) while 1: msg = input() msg = pickle.dumps(msg) client.send(msg)
Отредактировано Magister6239 (Янв. 14, 2023 04:39:47)
Офлайн
Где у тебя join()? Да и в цикле не надо потоки создавать. Создай один поток хотя бы, который рабтает и завершается исправно.
Офлайн
Мне нужно чтобы потоки работали вместе с основной программой одновременно, если использовать join то выполнение дальше не пойдет пока потоки не завершатся. А в чем проблема создания в цикле? На каждое подключение один поток. Не понимаю, как выполнять основную программу вместе с потоками и с возможностью отключить все по нажатию stop единожды
Отредактировано Magister6239 (Янв. 15, 2023 04:56:57)
Офлайн
Я попробовал каждую задачу засунуть в один поток и даже главный цикл который порождает один поток на подключение. По сути основная программа просто запускает все потоки с join и все. Но даже так нажимая кнопку stop pycharm не завершает программу. Как сделать так чтобы при одном нажатии все завершалось. Это же не просто так, он не завершает с первого раза потому что проблема с потоками, но где?
Офлайн
Попробуй вот этот код
#!/usr/bin/env python3 import threading import socket import pickle def thread_func(sock): while True: msg = sock.recv(1024) msg = pickle.loads(msg) print(msg) server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("127.0.0.1", 63900)) server.listen() while True: sock, addr = server.accept() thr = threading.Thread(target=thread_func, args=(sock,))#, daemon=True) thr.start() thr.join() print('thread')
Офлайн
Magister6239взял твой код сервера в отдельный файл, и клиента в отдельный файл, каждый запустил, отправил сообщения, остановил одним нажатием на стоп сервер и одним нажатием на стоп клиент, а вообще там есть пункт остановить все
Когда нажимаю кнопку stop используя модуль threading, то Pycharm не останавливает и не убивает процесс, и только со второго клика все останавливается
Офлайн
py.user.nextЭто не сработало. “thread” не пишется в консоль из-за join. Но я выяснил что кнопка stop убивает не главный процесс а дочерние. Поэтому daemon=True не работает. Теперь вопрос как сказать pycharm что я хочу убить главный процесс.
Попробуй вот этот код
Офлайн
Magister6239У меня пишется для каждого подключенного клиента, но я туда просто писал abc в каждом терминале при подключении с трёх разных терминалов одновременно.
Это не сработало. “thread” не пишется в консоль из-за join.
Magister6239Там один процесс и в нём четыре потока (если три клиента подключить к серверу одновременно). Главный поток, который есть всегда от начала до конца выполнения программы, запускает временные потоки, поэтому нужен .join(), чтобы кжадый запущенный поток оставался на связи с главным потоком, который его запустил. Главный поток потом ими управляет и контролирует их, в том числе и обрабатывая падения этих потоков. Если у тебя в потоке произошло что-то неправильное и он просто выпал, не успев ничего сказать никому, кто это падение потока обработает? Он сам не сможет обработать, его нет больше.
Но я выяснил что кнопка stop убивает не главный процесс а дочерние.
Отредактировано py.user.next (Янв. 15, 2023 23:03:39)
Офлайн