Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 14, 2023 04:34:33

Magister6239
Зарегистрирован: 2019-08-13
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

pycharm

Я не знаю куда обратиться и поэтому пишу сюда.
Когда нажимаю кнопку 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)

Офлайн

#2 Янв. 14, 2023 08:17:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

pycharm

Где у тебя join()? Да и в цикле не надо потоки создавать. Создай один поток хотя бы, который рабтает и завершается исправно.



Офлайн

#3 Янв. 15, 2023 04:13:53

Magister6239
Зарегистрирован: 2019-08-13
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

pycharm

Мне нужно чтобы потоки работали вместе с основной программой одновременно, если использовать join то выполнение дальше не пойдет пока потоки не завершатся. А в чем проблема создания в цикле? На каждое подключение один поток. Не понимаю, как выполнять основную программу вместе с потоками и с возможностью отключить все по нажатию stop единожды

Отредактировано Magister6239 (Янв. 15, 2023 04:56:57)

Офлайн

#4 Янв. 15, 2023 04:31:21

Magister6239
Зарегистрирован: 2019-08-13
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

pycharm

Я попробовал каждую задачу засунуть в один поток и даже главный цикл который порождает один поток на подключение. По сути основная программа просто запускает все потоки с join и все. Но даже так нажимая кнопку stop pycharm не завершает программу. Как сделать так чтобы при одном нажатии все завершалось. Это же не просто так, он не завершает с первого раза потому что проблема с потоками, но где?

Офлайн

#5 Янв. 15, 2023 05:12:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

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')



Офлайн

#6 Янв. 15, 2023 14:15:20

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1355
Репутация: +  119  -
Профиль   Отправить e-mail  

pycharm

Magister6239
Когда нажимаю кнопку stop используя модуль threading, то Pycharm не останавливает и не убивает процесс, и только со второго клика все останавливается
взял твой код сервера в отдельный файл, и клиента в отдельный файл, каждый запустил, отправил сообщения, остановил одним нажатием на стоп сервер и одним нажатием на стоп клиент, а вообще там есть пункт остановить все

Офлайн

#7 Янв. 15, 2023 15:46:49

Magister6239
Зарегистрирован: 2019-08-13
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

pycharm

py.user.next
Попробуй вот этот код
Это не сработало. “thread” не пишется в консоль из-за join. Но я выяснил что кнопка stop убивает не главный процесс а дочерние. Поэтому daemon=True не работает. Теперь вопрос как сказать pycharm что я хочу убить главный процесс.

Офлайн

#8 Янв. 15, 2023 22:55:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

pycharm

Magister6239
Это не сработало. “thread” не пишется в консоль из-за join.
У меня пишется для каждого подключенного клиента, но я туда просто писал abc в каждом терминале при подключении с трёх разных терминалов одновременно.

Magister6239
Но я выяснил что кнопка stop убивает не главный процесс а дочерние.
Там один процесс и в нём четыре потока (если три клиента подключить к серверу одновременно). Главный поток, который есть всегда от начала до конца выполнения программы, запускает временные потоки, поэтому нужен .join(), чтобы кжадый запущенный поток оставался на связи с главным потоком, который его запустил. Главный поток потом ими управляет и контролирует их, в том числе и обрабатывая падения этих потоков. Если у тебя в потоке произошло что-то неправильное и он просто выпал, не успев ничего сказать никому, кто это падение потока обработает? Он сам не сможет обработать, его нет больше.

Всё это происходит в одном процессе в операционной системе. Оно не распределяется по ядрам процессора там и так далее, потому что нечего распределять.



Отредактировано py.user.next (Янв. 15, 2023 23:03:39)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version