Python线程 - 优先输出输出

时间:2014-09-24 20:19:45

标签: python multithreading

我有一个python程序,它使用套接字通过网络发送消息,套接字使用两个线程,一个用于运行服务器,另一个用于运行客户端。 但是,如果在用户部分输入输入时接收到消息,则在输入的两半之间打印接收的消息。 虽然这在功能上没有区别,但在美学上看起来很糟糕。有没有什么办法可以让消息像用户开始输入之前一样输出?

如果我的解释不清楚,假设用户输入了" hel"在收到消息(" Sup")之前,然后" lo"之后,会显示:

HelPartner Sent: Sup
lo

任何建议都非常受欢迎。

1 个答案:

答案 0 :(得分:0)

认为你只需readline即可。

当然,这意味着它在Windows上无法提供帮助。或者,如果您使用sys.stdin做了任何时髦的事情,或者您直接从stdin阅读,而不是使用input这样的功能,或者您还没有一个TTY,或者你在IDLE之类的环境下运行,以自己的方式挂钩input等等。但假设这些都不是一个交易破坏者,readline.get_line_buffer()可能就是你想要的

如果您希望将输出排队直到用户完成输入 - 基本上与shell相同,例如,作业控制消息 - 如下所示:

import readline
output_buffer = []
output_buffer_lock = threading.Lock()

# Wherever you would normally print the output
if readline.get_line_buffer():
    with output_buffer_lock:
        output_buffer.append(output)
else:
    with output_buffer_lock:
        print('\n'.join(output_buffer + [output]))
        output_buffer = []

# Wherever you're reading the input
line = input()
with output_buffer_lock:
    print('\n'.join(output_buffer + [output]))
    output_buffer = []

如果您想要中断用户的输入,请记住他们输入的内容,显示输出并重新启动输入,这有点复杂。输出线程需要一些方法来存储当前输入缓冲区(readline.get_line_buffer),中断输入线程,清除当前输入(打印'\r' then a row of spaces and another '\r' should do it in simple cases, but see below), print the output, start a new输入call, and refill the buffer ( readline.insert_text {{1} } readline.redisplay then possibly输入; note that you have to call this after set_pre_input_hook`来执行此操作。)

如果输入发生在主线程上,signal处理程序(只会引发自定义异常)是中断starts but before it returns, so you probably want to use调用的好方法。如果没有,那就太麻烦了。

同时,input支持多行输入,默认情况下,如果用户输入的字符数超过80(或readline),则会将内容包装到多行。在这种情况下,实际上没有办法从Python的$COLS模块提供的高级API中删除整个输入。除非你想用readline或自定义扩展模块编写或找到更低级别的包装器,否则我无法解决这个问题。