Найти - Пользователи
Полная версия: pycharm
Начало » Python для новичков » pycharm
1
Magister6239
Я не знаю куда обратиться и поэтому пишу сюда.
Когда нажимаю кнопку 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)
py.user.next
Где у тебя join()? Да и в цикле не надо потоки создавать. Создай один поток хотя бы, который рабтает и завершается исправно.
Magister6239
Мне нужно чтобы потоки работали вместе с основной программой одновременно, если использовать join то выполнение дальше не пойдет пока потоки не завершатся. А в чем проблема создания в цикле? На каждое подключение один поток. Не понимаю, как выполнять основную программу вместе с потоками и с возможностью отключить все по нажатию stop единожды
Magister6239
Я попробовал каждую задачу засунуть в один поток и даже главный цикл который порождает один поток на подключение. По сути основная программа просто запускает все потоки с join и все. Но даже так нажимая кнопку stop pycharm не завершает программу. Как сделать так чтобы при одном нажатии все завершалось. Это же не просто так, он не завершает с первого раза потому что проблема с потоками, но где?
py.user.next
Попробуй вот этот код
  
#!/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')
xam1816
Magister6239
Когда нажимаю кнопку stop используя модуль threading, то Pycharm не останавливает и не убивает процесс, и только со второго клика все останавливается
взял твой код сервера в отдельный файл, и клиента в отдельный файл, каждый запустил, отправил сообщения, остановил одним нажатием на стоп сервер и одним нажатием на стоп клиент, а вообще там есть пункт остановить все
Magister6239
py.user.next
Попробуй вот этот код
Это не сработало. “thread” не пишется в консоль из-за join. Но я выяснил что кнопка stop убивает не главный процесс а дочерние. Поэтому daemon=True не работает. Теперь вопрос как сказать pycharm что я хочу убить главный процесс.
py.user.next
Magister6239
Это не сработало. “thread” не пишется в консоль из-за join.
У меня пишется для каждого подключенного клиента, но я туда просто писал abc в каждом терминале при подключении с трёх разных терминалов одновременно.

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

Всё это происходит в одном процессе в операционной системе. Оно не распределяется по ядрам процессора там и так далее, потому что нечего распределять.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB