Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何管理来自服务器的两个以上线程之间的请求?_Python_Multithreading_Sockets_Python Multithreading_Serversocket - Fatal编程技术网

Python 如何管理来自服务器的两个以上线程之间的请求?

Python 如何管理来自服务器的两个以上线程之间的请求?,python,multithreading,sockets,python-multithreading,serversocket,Python,Multithreading,Sockets,Python Multithreading,Serversocket,服务器端: def data(): data2="" with open('group9.json') as file: readed_Data=json.load(file) for data in readed_Data['data']: data_send+=data return data2 def connected(sock,id)

服务器端:

def data():
      data2=""
        with open('group9.json') as file:
           readed_Data=json.load(file)
               
       for data in readed_Data['data']:
           data_send+=data
       return data2

def connected(sock,id):
    print("Thread starts",id)

    name= sock_a.recv(1024).decode('utf-8')        

    API=requests.get("https://api.agify.io/?name="+name)
    response=API.text
    data=json.loads(response)
    
    #To save the new info
    with open("temporary_file.json","w") as file:
          json.dump(data, file, indent=4)
    

    while True:
            #recieve number from client
            number = sock_a.recv(1024).decode('utf-8')
       
            data_send=""
            if(number=="1"):
                 data_send=data()
            else:
                 data_send="not=1"
            sock.sendall(data_send.encode('utf-8'))

#TCP SOCKET
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as sock_p: 
sock_p.bind(("127.0.0.1", 49999))
#sock_p.settimeout(15)

sock_p.listen(3)
threads=[]
while True:
    sock_a, sockname = sock_p.accept()
    print("connected to ",sockname[0],sockname[1])
    t = threading.Thread(target=connected, args=(sock_a,len(threads)+1))
    threads.append(t)
    print(threads)
    t.start() 
这是服务器端{THREAD}的代码。当客户端第二次在客户端的recv上获得块后,两个或多个客户端请求不同的名称时,我认为问题来自线程。有什么解决方案吗

客户端:

with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as sock_p: 

    sock_p.connect(("127.0.0.1", 49999))

 while True:
        
        print("enter the name")
        name=input()
        sock_p.sendall(name.encode('utf-8'))
        print("enter the number")
        number=input()
        sock_p.sendall(number.encode('utf-8'))
        data=sock_p.recv(1024)  
        print(data)

实际上不可能说出所提供代码的实际情况——没有线程,套接字的类型也不清楚。请查看帮助页面。从我收集的信息和一些假设来看,您的协议本质上是一对一的–只有一个连接(
sock
),它用于recv发送/发送recv对。一旦有多个客户端1和2,您就可以得到代码不处理的交错recv1-recv2-send1-send2“对”。我编辑它,请再次查看您的服务器从全局
sock\u a
读取,而不是从客户端/线程/函数本地
sock
读取。一旦另一个客户端连接,所有现有线程都将切换到其套接字。TLDR:仅使用
sock
而不是
sock\u a
内部的
已连接的