Python:在另一个线程检查消息时接受原始输入

0 投票
2 回答
963 浏览
提问于 2025-04-16 12:44

我正在用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

其实你只是在创建一个线程,这个线程按顺序读取和发送一条消息。

你需要创建两个线程,它们可以独立地读取和写入消息。真正的问题在于这两个线程之间的同步,以及它们共享资源时可能出现的冲突。

撰写回答