Python在远程主机上引发引导线程错误

0 投票
1 回答
1522 浏览
提问于 2025-04-18 08:11

我正在运行一个包含三个线程的脚本;

主线程负责处理IRC消息,第二个线程是一个套接字服务器,当它作为客户端连接时,会将IRC中的字符串发送到一个闪存显示器上,第三个线程是一个套接字服务器,当客户端连接时,会发送一个政策文件,这是闪存所需的。

这个Python文件在我的“本地主机”上运行得很好,但当我把它放到我的Linode服务器上时,它只接收到第一个字符串,并发送了在闪存上显示的字符串响应,然后就崩溃了,出现了以下错误信息。

错误信息如下:

Traceback (most recent call last):
  File "/opt/python3.3/lib/python3.3/threading.py", line 616, in _bootstrap
    self._bootstrap_inner()
  File "/opt/python3.3/lib/python3.3/threading.py", line 682, in _bootstrap_inner
    self._stop()
TypeError: 'Event' object is not callable

这是我的套接字服务器代码:

class FlashSOCKET (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
        self._stop = threading.Event()
        self.stopWaitLoop = False
        self.conn = None
        self.addr = None
        self.HOST = None
        self.PORT = 7001
        self.s = None

    def run(self):
        global running, toSend, message
        print ("Starting " + self.name)
        while running:
            self.startListening()
            while running:
                if (messageDeque):
                    try:
                        print(self.conn.recv(1024))
                        self.conn.send(messageDeque.popleft().encode('utf8'))
                        print (messageDeque)
                        break
                    except:
                        pass # Nothing to do keep listening

            if (self.conn != None):
                self.close_connection()
        if (self.conn != None):
            self.close_connection()

        print ("Exiting " + self.name)

    def startListening(self):
        global running, message, toSend
        print ("starting to listen")
        for res in socket.getaddrinfo(self.HOST, self.PORT, socket.AF_UNSPEC,
                                      socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
            af, socktype, proto, canonname, sa = res
            try:
                self.s = socket.socket(af, socktype, proto)
                self.s.settimeout(0.5)
            except socket.error as msg:
                self.s = None
                continue
            try:
                self.s.bind(sa)
                self.s.listen(1)

            except socket.error as msg:
                print ("socket error")
                self.s.close()
                self.s = None
                continue
            break
        if self.s is None:
            print ('could not open socket')
            sys.exit(1)
        while(running):
            try:
                self.conn, self.addr = self.s.accept()
                time.sleep(1)
                break
            except:
                continue
        print ('Connected by', self.addr)

    def close_connection(self):
        self.conn.close()
        print ("connection closed")

Running是一个全局的布尔标志变量,让我在需要的时候可以停止程序。messageDeque是一个双端队列缓冲区,当人们在IRC上聊天时,主线程会将字符串填充到这个缓冲区中。

我觉得,toSend和message是一些多余的代码。

1 个回答

0
  1. 尽量避免使用全局变量。在一般编程中,全局变量就有点不靠谱,但在多线程编程中,它们会让人更困惑,没什么用处。

  2. Event 对象:用 if self._stop.is_set() 来判断,而不是检查一个全局变量。

撰写回答