Как бороться с несколькими потоками в Python? - PullRequest
0 голосов
/ 09 июня 2018

Я тестирую многопоточность на локальном сервере и клиенте с помощью python.Я посмотрел на множество примеров, но они сделали это по-разному.Я новичок, поэтому мне трудно это понять.Моя проблема с кодом заключается в том, что когда клиент отправляет только одно сообщение, он работает нормально;однако, когда клиент отправляет несколько сообщений (используя цикл for) или несколько клиентов отправляют сообщения одновременно, сервер получает все сообщения одновременно, поэтому он печатает неверным образом.Вот часть моего кода:

для серверной части:

def insert_projects(project):
    ...

class ThreadNum(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            msg = self.queue.get()
            print("Got message", end=' ')
            insert_projects(msg)
            time.sleep(1)
            self.queue.task_done()
def main():
    server_address = (server_ip, server_port)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(server_address)
    print('socket binded to %s port %s' % server_address)
    sock.listen(5)
    print('socket is listening')
    connection, client_address = sock.accept()
    for i in range(100):
        t = ThreadNum(queue)
        t.setDaemon(True)
        t.start()
    while True:
        data = connection.recv(buf_size)
        data = ast.literal_eval(data.decode('utf-8'))
        print('received ', data)
        str_message = str(data)
        queue.put(str_message)
        queue.join()

Функция insert_projects предназначена только для вставки информации о сообщении в базу данных mysql, поэтому она не влияет на эту часть.

для клиентской части:

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect the socket to the port where the server is listening
server_address = (server_ip, server_port)
print('connecting to %s port %s' % server_address)
sock.connect(server_address)

try:
# Input data
for i in range(3):
    message = {"Project":"KF#2","Type":"GW1","Qty":"12345678","DATE":"18/05/24","TIME":"14:16:20"}
    # Send data
    print('sending ', message)
    sock.sendall(str(message).encode('utf-8'))

finally:
    print('closing socket')
    sock.close()

Может кто-нибудь помочь мне, как разделить полученные сообщения одно за другим в очередь?

...