Python服务器中的多个线程

时间:2012-12-14 20:12:04

标签: python multithreading

我正在为学校建立一个小的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()

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

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

因此,您的客户流程如下:

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

Threading Documentation

threading.Thread Documentation

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