Как я могу открыть и закрыть поток с помощью Python Socket Server?Python

Программы на Python
Anonymous
Как я могу открыть и закрыть поток с помощью Python Socket Server?

Сообщение Anonymous »

У меня есть простой сервер сокетов Python, и я хочу, чтобы мой клиент мог открывать/закрывать поток процесса в течение нескольких соединений (т. е. я не хочу, чтобы мое соединение клиент-сервер оставалось открытым между запросами). Упрощенная версия сервера выглядит так:
_bottle_thread = None # I have tried this and a class variable

class CalibrationServer(socketserver.BaseRequestHandler):

allow_reuse_address = True
request_params = None
response = None

bottle_thread = None

def handle(self):
self.data = self.request.recv(1024).strip()
self.request_params = str(self.data.decode('utf-8')).split(" ")
method = self.request_params[0]

if method == "start": self.handle_start()
elif method == "stop": self.handle_stop()
else: self.response = "ERROR: Unknown request"

self.request.sendall(self.response.encode('utf-8'))

def handle_start(self):
try:
bottle = self.request_params[1]
_bottle_thread = threading.Thread(target=start, args=(bottle,))
_bottle_thread.start()
self.response = "Ran successfully"
print(_bottle_thread.is_alive(), _bottle_thread)
except Exception as e:
self.response = f"ERROR: Failed to unwrap: {e}"

def handle_stop(self):
print(_bottle_thread)
if _bottle_thread and _bottle_thread.is_alive():
_bottle_thread.join() # Wait for the thread to finish
self.response = "Thread stopped successfully"
else:
self.response = "No active thread to stop"

if __name__ == "__main__":
HOST, PORT = LOCAL_IP, CAL_PORT

with socketserver.TCPServer((HOST, PORT), CalibrationServer) as server:
server.serve_forever()


Процесс начинается нормально, но когда мое соединение с сервером закрывается, я больше не могу получить доступ к _bottle_thread. Он просто повторно инициализируется как None. У меня есть только один главный компьютер, взаимодействующий с сервером, и мне понадобится только один экземпляр start. Я пробовал использовать переменные класса для его хранения и использовать глобальные переменные. Я также пробовал использовать TCP-серверы Threading и Forking. Как я могу получить доступ к этой теме, чтобы закрыть ее? Нужно ли мне его изменить, чтобы соединение всегда было открыто? Есть ли другой способ решить эту проблему? Я хочу использовать сервер, чтобы мне было легче контролировать этот процесс, поскольку он будет работать на 8 разных компьютерах одновременно, но я полностью открыт для других идей (я пробовал Ansible, у меня это не сработало). Спасибо!
РЕДАКТИРОВАТЬ:
Вот мой клиентский код:
HOST, PORT = LOCAL_IP, CAL_PORT
data = " ".join(sys.argv[1:])

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((HOST, PORT))
sock.sendall(bytes(data + "\n", "utf-8"))
received = str(sock.recv(1024), "utf-8")

print("Sent: {}".format(data))
print("Received: {}".format(received))

Он открывает, отправляет и закрывает соединение с сервером с помощью нескольких простых аргументов.
Вот мой вывод на консоль от клиента:
р>
(venv) path$ python cal_client.py start argument
Sent: start argument
Received: Ran successfully
(venv) path$ python cal_client.py stop
Sent: stop
Received: No active thread to stop

и мой сервер:
Received from 127.0.0.1:
['start', 'argument']
Initializing
True
Received from 127.0.0.1:
['stop']
None # the thread is showing None


Подробнее здесь: https://stackoverflow.com/questions/783 ... ket-server

Вернуться в «Python»