如何解决Python线程无法在不到6个小时前运行的代码中突然锁定cquire吗?
我正在用python编写一个用于局域网的TCP聊天室的代码,发现here。我有两个python脚本,分别是 client.py 和 server.py 。
server.py似乎可以正常运行,并且符合预期 但是当客户端在键入消息后单击“ enter”时,客户端服务器将引发线程错误
这两个文件的代码如下。 错误在最后。
server.py
import threading
import socket
port = 34443
localhost = '127.0.0.1'
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
while True:
try:
host = input("Enter host address: ")
if host == 'local':
host = localhost
server.bind((host,port))
print('\nServer connection success')
break
except Exception as e:
print("\nError occurred ")
print(e)
break
server.listen()
clients = []
nicknames = []
def broadcast(message):
for client in clients:
client.send(message)
def toOthers(message,client):
for c in clients:
if c == client:
pass
else:
c.send(message)
def handle(client):
while True:
try:
message = client.recv(1024)
toOthers(message)
except:
index = clients.index(client)
clients.remove(client)
client.close()
nickname = nicknames[index]
broadcast(f'{nickname} has left the chatroom'.encode('ascii'))
nicknames.remove(nickname)
break
def receive():
while True:
try:
client,address = server.accept()
print(f'\nConnected with {str(address)}')
client.send("NICK".encode('ascii'))
nickname = client.recv(1024).decode('ascii')
nicknames.append(nickname)
clients.append(client)
print(f'\nNickname of the client is {nickname}')
broadcast(f'{nickname} joined the chatroom'.encode('ascii'))
client.send('Connected to the server'.encode('ascii'))
thread = threading.Thread(target = handle,args=(client,))
thread.start()
except KeyboardInterrupt:
print('\nShutting down server ...')
broadcast('CLOSE_CONN'.encode('ascii'))
for t in threading.enumerate:
t.join()
server.close()
break
print('\nServer is listening ...')
receive()
client.py
import socket
import threading
# Choosing Nickname
nickname = input("Choose your nickname: ")
# Connecting To Server
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('192.168.1.11',34443))
# Listening to Server and Sending Nickname
def receive():
while True:
try:
# Receive Message From Server
# If 'NICK' Send Nickname
message = client.recv(1024).decode('ascii')
if message == 'CLOSE_CONN':
close_conn()
elif message == 'NICK':
client.send(nickname.encode('ascii'))
else:
print(message)
except KeyboardInterrupt:
close_conn()
except:
# Close Connection When Error
print("An error occured!")
client.close()
break
def close_conn():
print('\nClosing connection')
client.close()
receive_thread.join()
write_thread.join()
# Sending Messages To Server
def write():
while True:
try :
message = '{}: {}'.format(nickname,input(''))
client.send(message.encode('ascii'))
except KeyboardInterrupt:
print('\nClosing connection')
client.close()
receive_thread.join()
write_thread.join()
# Starting Threads For Listening And Writing
receive_thread = threading.Thread(target=receive)
receive_thread.start()
write_thread = threading.Thread(target=write)
write_thread.start()
在键入消息后按Enter键,终端将挂起,并需要使用 Ctrl + C 终止,这时它将打印以下内容
^C
Exception ignored in: <module 'threading' from '/usr/lib/python3.7/threading.py'>
Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py",line 1281,in _shutdown
t.join()
File "/usr/lib/python3.7/threading.py",line 1032,in join
self._wait_for_tstate_lock()
File "/usr/lib/python3.7/threading.py",line 1048,in _wait_for_tstate_lock
elif lock.acquire(block,timeout):
KeyboardInterrupt
Fatal Python error: could not acquire lock for <_io.BufferedWriter name='<stdout>'> at interpreter shutdown,possibly due to daemon threads
Thread 0x00007fbd82b87700 (most recent call first):
File "/home/tulsi/Documents/CODES/Python/FCCprojects/chatroom/client.py",line 104 in write
File "/usr/lib/python3.7/threading.py",line 865 in run
File "/usr/lib/python3.7/threading.py",line 917 in _bootstrap_inner
File "/usr/lib/python3.7/threading.py",line 885 in _bootstrap
Thread 0x00007fbd83388700 (most recent call first):
File "/home/tulsi/Documents/CODES/Python/FCCprojects/chatroom/client.py",line 83 in receive
File "/usr/lib/python3.7/threading.py",line 885 in _bootstrap
Current thread 0x00007fbd83913740 (most recent call first):
Aborted
任何帮助将不胜感激,因为我是python线程和stackoverflow的新手:)
感谢您阅读本文。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。