繁体   English   中英

Python服务器中的多个线程

[英]Multiple threads in Python server

我正在为学校建立一个小的Python服务器脚本,它必须读取文件并将其发送到客户端。

现在,我需要服务器同时回答客户端的多个请求。 此时它只接受1个客户端......在客户端被应答后,它会移动到下一个客户端。

我的老师告诉我使用多个进程/线程来实现这一点。 我是Python的新手,所以我不知道如何管理它。

我怎样才能做到这一点?

这是我的代码:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1:
    print "server ready, waiting..."
    client, address = s.accept() 
    print "recvd client", address 
    data = client.recv(size) 
    if data:

        parametro_data = data.split(' ')
        if(parametro_data[0] == '/GET'):

            theFile = parametro_data[1].replace('\r\n','')

            if os.path.isfile(theFile):
                f = open(theFile, 'r')
                for line in f:
                    client.send(line)
                f.close()
            else:
                client.send("File not exists")

    client.close()

你应该做的是用一个请求(即在s.accept()行返回之后)将服务器线程捕获的时间保持在最低限度。 一种常见的方法是在那之后直接生成一个线程,然后再单独处理请求。 然后你可以直接返回等待下一个请求(即再次accept ),而不会被另一个线程中发生的仍在进行的处理暂停。

我还建议您查看socketserver模块,因为它已经在更高级别上提供了这一点。 您只需为连接定义处理程序,然后使用该处理程序创建服务器,并使服务器“永远服务”

要在您描述的模型中处理此问题,您将获取执行实际文件发送的代码并将其封装在线程内部。

class HandleClient( threading.Thread ):
 def __init__( self, clientSocket, file_to_read ):
  ...setting up the thread object...
 def run( self ):
  ...sending code...

这将发送文件,以便您的主接受线程能够处理其他客户端。

那么,您的客户端流程如下:

新客户端连接 - >接受连接 - >创建新线程对象并调用start()方法 - >线程将文件发送到此客户端然后关闭连接。

线程文档

threading.Thread文档

我也会查看一个线程池,因为在它没有给你带来任何好处之前你只能拥有这么多线程,或者如果可能的话,一个提供服务器功能的框架你必须编写业务逻辑,在你的情况下发送文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM