Python 地址已在twisted中与多线程服务器一起使用

Python 地址已在twisted中与多线程服务器一起使用,python,multithreading,twisted,Python,Multithreading,Twisted,我正在尝试使用twisted用python编写一个多线程服务器。callInThread(self.task)是创建一个新线程,以便在每次客户端从服务器请求某个任务时运行task()。当客户端一个接一个地发送请求(全部通过端口53)时,一切正常,但当同时有多个请求时,它说 文件“”,第1行,处于绑定状态 socket.error:[Errno 98]地址已在使用中 我的线程有什么问题吗?一次只能使用一个端口?如果是这样,我该如何处理我的服务器上的多线程呢? 非常感谢 class BaseThre

我正在尝试使用twisted用python编写一个多线程服务器。callInThread(self.task)是创建一个新线程,以便在每次客户端从服务器请求某个任务时运行task()。当客户端一个接一个地发送请求(全部通过端口53)时,一切正常,但当同时有多个请求时,它说

文件“”,第1行,处于绑定状态 socket.error:[Errno 98]地址已在使用中

我的线程有什么问题吗?一次只能使用一个端口?如果是这样,我该如何处理我的服务器上的多线程呢? 非常感谢

class BaseThreadedUDPServer(DatagramProtocol):
    def datagramReceived(self, datagram, (host, port)):
        print "received %r from %s:%d" % (datagram, host, port)
        reactor.callInThread(self.task)

    def task(a):
        print "waiting on port:", csport
        while 1:
            ## RCV QUERY ##
            query, addr = csSocket.recvfrom(csbuf)
            ## GET ANS ##
            ans = socket.gethostbyname(query)
            ## SEND ANS ##
            scSocket.sendto(ans, scaddr)

def main():
    print "main"
    reactor.listenUDP(53, BaseThreadedUDPServer())
    reactor.run()

你不需要线程。这是一辆可怕的马车。Twisted已经在为您调用
recv
:这是传递给
datagramReceived
的结果。你自己别说了。你不需要一根线

然而,这可能与你的问题无关。53是默认的DNS端口:您遇到的问题是另一台服务器,可能是一台DNS服务器已经在该计算机上运行。尝试将53更改为其他值

但我不是很确定;以后,请粘贴完整的回溯。回溯行显然不是来自您粘贴的示例,因为第1行除了“class”语句外没有其他内容。此外,由于此代码缩进错误并引发一个
SyntaxError
,因此它显然与您正在运行的代码不完全相同


假设您实际上正在使用DNS做一些事情,Twisted有自己的DNS服务器;你应该使用而不是实现你自己的DNS数据包解析。

@pilu:看起来你一点也没有被扭曲。。。你不需要线程来并行处理事情,事实上你应该完全避免它们。你是什么意思?你不需要线程来运行Parralel中的东西吗?基本上:是的。但是你(一个扭曲的用户)需要线程吗?不,twisted会照顾他们。