Python在远程主机上引发引导线程错误
我正在运行一个包含三个线程的脚本;
主线程负责处理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
尽量避免使用全局变量。在一般编程中,全局变量就有点不靠谱,但在多线程编程中,它们会让人更困惑,没什么用处。
Event
对象:用if self._stop.is_set()
来判断,而不是检查一个全局变量。