首页 文章

Python chatserver - 由于阻塞调用而无法关闭服务器

提问于
浏览
0

我正在用Python编写一个聊天服务器来进行分配 . 但是,我在关闭服务器时遇到问题 . 这是发生了什么:

当客户端连接时,我产生了两个线程: readThreadwriteThread . readThread 负责从客户端读取数据并将其打印到 stdoutwriteThread 负责从 stdin 读取消息并将其发送到客户端 .

当客户端发送 'EXIT' 时,我想关闭服务器 . 我的 writeThread 在这样的循环中运行:

def write(self) :
        while self.dowrite :
            data = sys.stdin.readline().strip();            
            self.conn.send(data);
        print 'WriteThread loop ended';

现在,当我收到 EXIT 时,我将 dowrite 设置为false,但是,当然,由于阻塞调用 sys.stdin.readline().strip() ,这不会破坏while循环 .

那么,会发生什么:断开连接,客户端需要发送 EXIT ,然后我需要在控制台上点击返回 . 有什么方法可以解决这个问题,所以当客户端发送退出消息时,我会立即在 write() 中跳出while循环 .

EDIT 它如何结合在一起:

主线程产生两个线程: readwrite ,然后等待(连接) read 完成 . Read 在读取 EXIT 时结束 . 一旦 read 线程结束,主线程继续并在写线程中将 dowrite 设置为false,这应该结束写循环,但这只能在while循环再次迭代一次时发生 .

1 回答

  • 1

    使子线程成为守护进程:

    t.daemon = True
    

    如果您的程序退出,守护程序线程将停止 .

    您可以使用an event通知其他线程 . 在发生事件的线程中:

    event.set() # event occurred
    

    在其他线程中:

    event.wait() # wait for event
    

相关问题