Python:在另一个线程检查消息时接受原始输入
我正在用Python写一个基本的聊天客户端,项目完成得很简单。不过,当我提交后,他们问我能不能让程序在检查消息的同时接受用户输入(这是给提前完成作业的人额外的任务)。
我觉得这可能跟线程有关,所以我尝试创建一个线程来接受用户输入,另一个线程来检查消息,但似乎使用raw_input的时候会阻止另一个线程的运行。
我该怎么在Python中做到这一点呢?也许我对线程的理解有误? - Python新手
第二次尝试:
#Update last connection
s[user] = str(time.time());
#Start chat server
class chatServer ( threading.Thread ):
def __init__ (self, channel):
self.channel = channel
self.lastMessage = ""
threading.Thread.__init__ ( self ) #Pass to thread constructor
def messageOut ( self ):
while 1:
print "Asking for input"
message = raw_input("Message: ");
s[self.channel] = message;
time.sleep(1)
def messageIn ( self ):
while 1:
print "Checking for new messages"
if s[self.channel]!=self.lastMessage:
print s[self.channel]
self.lastMessage = s[self.channel]
time.sleep(1)
print "Welcome " + user + " type to send a message"
chatServer("channel1").messageIn()
chatServer("channel1").messageOut()
第一次尝试:
#Start chat server
class chatServer ( threading.Thread ):
def __init__ (self, user, channel, server):
self.channel = channel
self.lastMessage = ""
self.user = user
self.s = server
threading.Thread.__init__ ( self ) #Pass to thread constructor
def start ( self ):
print "Welcome " + self.user + " type to send a message"
self.messageIn()
self.messageOut()
def messageOut ( self ):
while 1:
message = raw_input("Message: ");
s['message'] = message;
time.sleep(1)
def messageIn ( self ):
while 1:
print "Checking for new messages"
if s[self.channel]!=self.lastMessage:
print s[self.channel]
lastMessage = s[self.channel]
time.sleep(1)
chatServer(user, "channel1", server).start()
非常感谢你的时间
附言:服务器是一个简单的类,用来获取和发送它收到的消息
再附言:这不是作业,更多是出于我个人的兴趣
2 个回答
1
这不是你问题的真正答案,但我想提一下你可以看看eventlet。它让你可以使用协程,这样你就能处理你想做的事情,而且写出来的代码非常容易读懂,感觉也很符合Python的风格。
这里有个很棒的视频可以帮助你入门:PyCon 2010: Eventlet: 用同步接口进行异步I/O
这是它的主要项目网站:http://eventlet.net/
还有一个使用telnet的聊天示例:http://eventlet.net/doc/examples.html#multi-user-chat-server
希望这些对你有帮助,也希望你能找到你问题的真正答案。
0
其实你只是在创建一个线程,这个线程按顺序读取和发送一条消息。
你需要创建两个线程,它们可以独立地读取和写入消息。真正的问题在于这两个线程之间的同步,以及它们共享资源时可能出现的冲突。