Асинхронный чат на python multiprocessing
Всем привет. Пытаюсь разобраться с многопоточностью в python. Пишу простой чат с возможностью установки ника .
Сервер:
import multiprocessing as mp
import signal
import socket
from time import sleep
from loguru import logger
class Server:
def __init__(self) -> None:
self.host = "127.0.0.1"
self.port = 5555
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((self.host, self.port))
self.server.listen()
self.clients = []
self.nicknames = []
logger.info("server is started")
self.queue = mp.Queue()
def broadcast(self, message):
for client in self.clients:
logger.debug(message)
client.send(message)
sleep(2)
def handle(self, client):
while True:
try:
message = client.recv(1024)
self.broadcast(message)
except Exception as er:
if client in self.clients:
index = self.clients.index(client)
self.clients.remove(client)
client.close()
nickname = self.nicknames[index]
self.broadcast(f'{nickname} left the Chat!'.encode('ascii'))
self.nicknames.remove(nickname)
break
else:
logger.exception(er)
self.server.close()
def recieve(self):
while True:
client, address = self.server.accept()
print(f"Connected with {str(address)}")
client.send('NICK'.encode('ascii'))
nickname = client.recv(1024).decode('ascii')
sleep(2)
self.nicknames.append(nickname)
self.clients.append(client)
print(f'Nickname of the client is {nickname}')
self.broadcast(f'{nickname} joined the Chat'.encode('ascii'))
client.send('Connected to the Server!'.encode('ascii'))
thread = mp.Process(target=self.handle, args=(client,))
thread.start()
if __name__ == '__main__':
s = Server()
s.recieve()
Клиент:
import socket
import multiprocessing as mp
import threading
from time import sleep
import asyncio as asyn
from loguru import logger
class Client():
def __init__(self, nickname) -> None:
self.nickname = nickname
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.connect(('127.0.0.1', 5555))
self.stop_thread = False
def recieve(self):
while True:
if self.stop_thread:
break
try:
message = self.client.recv(1024).decode('ascii')
if message == 'NICK':
self.client.send(self.nickname.encode('ascii'))
sleep(1)
else:
sleep(1)
logger.info(message)
except Exception as er:
self.client.close()
self.stop_thread = True
logger.exception(er)
break
def write(self, text):
message = f'{self.nickname}: {text}'
self.client.send(message.encode('ascii'))
if __name__ == '__main__':
c = Client("test3")
with mp.Pool(4) as pool:
message_resoult = pool.apply(c.recieve)
write_resoult = pool.apply(c.write, ["assaaasd"])
Проблема в том, что при вызове message_resoult = pool.apply(c.recieve)
На клиенте процесс повисает и код не выполняется дальше. Как я понимаю это происходит из-за while True
в функции чтения ответа от сервера. Вопрос: Как мне постоянно принимать ответы от сервера и сохранять их в переменную для передачи ее на qt интерфейс. А также отправлять сообщения от клиента.