Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python线程-将输入优先于输出_Python_Multithreading - Fatal编程技术网

Python线程-将输入优先于输出

Python线程-将输入优先于输出,python,multithreading,Python,Multithreading,我有一个python程序,它使用套接字通过网络发送消息,它使用两个线程,一个运行服务器,一个运行客户端。 但是,如果在用户部分输入输入时收到消息,则在输入的两半之间打印收到的消息。 虽然这在功能上没有区别,但在美学上它看起来很可怕。是否有任何方法可以使消息输出为在用户开始键入之前收到的消息 如果我的解释不清楚,假设用户在收到消息Sup之前输入hel,然后在收到消息Sup之后输入lo,则会显示: HelPartner Sent: Sup lo 任何建议都是非常受欢迎的。我想你只需要几分钟就可以做

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

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

HelPartner Sent: Sup
lo
任何建议都是非常受欢迎的。

我想你只需要几分钟就可以做到这一点

当然,这意味着它对Windows没有帮助。或者,如果您使用sys.stdin做了一些令人毛骨悚然的事情,或者您直接从stdin读取而不是使用诸如input之类的函数,或者您不在TTY上,或者您在诸如IDLE之类的环境下运行,以自己的方式钩住输入,等等。但是假设这些都不是交易的破坏者,readline.get\line\u缓冲区可能是您想要的

如果您希望将输出排队,直到用户键入与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。获取\u line\u buffer,中断输入线程,清除当前输入打印“\r”,然后一行空格和另一个“\r”在简单情况下可以完成此操作,但请参见下文,打印输出,启动新的InputCall,并重新填充缓冲区readline.insert_text,然后可能重新显示readline.redisplay;请注意,您必须在InputStarts之后但在它返回之前调用此函数,因此您可能希望使用set_pre_input_hook`来执行此操作

如果输入发生在主线程上,只引发自定义异常的处理程序是中断输入调用的好方法。如果不是,那就要复杂得多


同时,readline支持多行输入,默认情况下,如果用户键入的字符超过80或$COLS,它会将内容包装到多行。在这种情况下,实际上无法从Python的readline模块提供的高级API中删除整个输入。除非您想编写或查找具有ctypes或自定义扩展模块的较低级别包装,否则我看不出解决此问题的任何方法。

…如果用户在“Sup”到达时没有键入内容,您希望它立即显示?没错,因此我仍然希望消息立即显示,但不是在当前消息的中间。不幸的是,在命令行上这样做并不容易,因为输入回音是为你完成的。您需要一次读取stdinchar的内容。当它看到第一个字符时,它会阻止背景Sup内容,直到它看到一个\n。我希望有一种方法可以删除输入,打印输出,然后重新输入?或者打印输出,就好像它是在用户开始键入之前完成的一样?您是否正在编写基于终端的聊天程序?我建议你看看诅咒