2011-03-01 55 views
0

我正在尝试为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() 

非常感谢您的时间

附:服务器是一个简单的类,获取/把消息它被赋予

PPS这不是功课,多为我的个人兴趣

回答

0

其实你只创建一个线程,读书的且顺序的方式发布一条消息。

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

+0

感谢您的输入,我添加的新代码是否使用两个线程?这似乎也没有工作! – 2011-03-01 15:09:51

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

希望它可以帮助你得到一个真正的答案,你的也是问题。