Как многопоточность и бесконечные циклы работают вместе - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь выучить питон, выполняю упражнения, смотрю видео онлайн.В настоящее время я пытаюсь создать многопоточный сервер чата, но мне трудно понять, как работают потоки.

Вот мой код:

<!-- language: lang-py -->

import socket
import threading

class ThreadedServer(threading.Thread):
    def __init__(self, host, port, buff_size):
        threading.Thread.__init__(self)
        self.host = host
        self.port = port
        self.buff_size = buff_size
        self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.host, self.port))

    def listen(self):
        self.sock.listen(5)
        while True:
            print('Waiting for a connexion...')
            self.c, self.addr = self.sock.accept()
            listening = listenToClient(self.c, self.addr)

class listenToClient(threading.Thread):
    def __init__(self, client, address):
        threading.Thread.__init__(self)
        global socks
        socks.append(client)
        client.send(("Bienvenue sur le serveur, entre ton pseudo: ").encode('utf-8'))

        self.name = client.recv(buff_size).decode('utf-8')
        welcome = "Welcome " + self.name + "! If ever you want to quit, type {quit}"
        client.send(welcome.encode('utf-8'))
        msg = self.name + " has joined the chat"
        broadcast(msg)

        while True:
            msg = client.recv(buff_size).decode('utf-8')
            if msg != '{quit}':
                broadcast(msg, self.name + ": ")
                print('TEST6')
            else:
                client.close()
                leave_msg = self.name + " has left"
                broadcast(leave_msg)
                break                   


def broadcast(msg, prefix=''):
    for sck in socks:
        content = prefix + msg
        sck.send(content.encode('utf-8'))


def Main():
    ThreadedServer(host,port,buff_size).listen()

host = '127.0.0.1'
port = 10000
buff_size = 1024

socks = []

if __name__ == '__main__':
    Main()

Код работает нормально длятолько один пользователь.Я думаю, что проблема в моем понимании потоков.По-моему, когда я набираю

listening = listenToClient(self.c, self.addr)

, создается новый поток, работающий параллельно с первым.На самом деле я вижу, что мой новый поток действительно выполняется и заканчивается здесь бесконечным циклом (управляет тем, что набирает мой первый подключенный пользователь):

    while True:
        msg = client.recv(buff_size).decode('utf-8')
        if msg != '{quit}':
            broadcast(msg, self.name + ": ")
            print('TEST6')

Но я думал, что исходный поток будет иметьпродолжение цикла здесь:

    while True:
        print('Waiting for a connexion...')
        self.c, self.addr = self.sock.accept()
        listening = listenToClient(self.c, self.addr)

Печать «Ожидание соединения» и ожидание второго соединения.Но это не тот случай.

Я почти уверен, что это недоразумение с моей стороны, я потратил часы, пытаясь изменить все и т. Д., В какой-то момент поток listenToClient() был просто методом в ThreadedServer().Но сейчас я очень растерялся и не знаю, что делать, поэтому я пришел сюда за помощью.

Заранее спасибо,

Винсент

...