Python:在另一个线程检查消息时接受Raw_input

时间:2011-03-01 14:53:13

标签: python chat

我正在尝试用Python为一个项目编写一个基本的聊天客户端,并且很容易完成任务。然而,当我递交它时,他们询问我是否可以在检查消息时接受用户输入(对于提前完成工作的人来说,这是一项额外的无标记任务)。

我认为这与线程有关,所以我尝试创建一个用于接受用户输入的线程和一个用于检查消息的线程,但是看起来raw_input会停止另一个线程。

我如何在python中执行此操作?也许我误解了线程是如何工作的? - Python Noob

第二次尝试:

#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()

非常感谢你的时间

P.S。 server是一个简单的类,可以获取/放置它给出的消息

P.p.s这不是作业,更多是出于个人兴趣

2 个答案:

答案 0 :(得分:1)

对你的问题不是一个真正的答案,但另外你可能想看看eventlet。 它允许你有一些共同的例程,使你能够处理你想要做的事情,但是以一种非常容易阅读/理解的方式,以及(非常)pythonic。

这是一个很棒的视频,可以帮助您入门:PyCon 2010: Eventlet: Asynchronous I/O with a synchronous interface

主要项目网站:http://eventlet.net/

使用telnet的聊天示例:http://eventlet.net/doc/examples.html#multi-user-chat-server

希望它有所帮助,你也可以得到你问题的真实答案。

答案 1 :(得分:0)

实际上,您只创建一个线程,以顺序方式读取和发布单个消息。

您必须创建两个读取和写入消息的线程,它们彼此独立。真正的问题是两者之间的同步以及共同的资源共享。