Python线程是否打印到与主线程不同的缓冲区?

Python线程是否打印到与主线程不同的缓冲区?,python,python-3.x,multithreading,networking,Python,Python 3.x,Multithreading,Networking,我有一个项目,我正在工作,但我已经提出了一个小样本代码下面的问题。我首先创建一个套接字,然后生成一个线程来接受连接(这样我就可以连接多个客户端)。当我接收到一个连接时,我会生成另一个线程来监听该连接。我也在一个循环中,它会给我一个提示,在那里我可以输入任何东西,它会把它打印出来给我 问题在于,当我通过套接字接收到某些内容时。它将打印到屏幕上。但当我尝试在控制台中键入任何内容时,控制台上来自套接字的文本将被删除。我想把插座上的所有东西都保留在屏幕上 import sys import socket

我有一个项目,我正在工作,但我已经提出了一个小样本代码下面的问题。我首先创建一个套接字,然后生成一个线程来接受连接(这样我就可以连接多个客户端)。当我接收到一个连接时,我会生成另一个线程来监听该连接。我也在一个循环中,它会给我一个提示,在那里我可以输入任何东西,它会把它打印出来给我

问题在于,当我通过套接字接收到某些内容时。它将打印到屏幕上。但当我尝试在控制台中键入任何内容时,控制台上来自套接字的文本将被删除。我想把插座上的所有东西都保留在屏幕上

import sys
import socket
from _thread import *

def recv_data(conn):
    while True:
        data = conn.recv(256)
        print(data)

def accept_clients(sock):
    while True:
        conn, addr = sock.accept()
        print("\nConnected with %s:%s\n" % (addr[0], str(addr[1])))
        start_new_thread(recv_data, (conn,))

def start_socket(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print("Socket created")

    try:
        port = int(port)
    except ValueError:
        print("Invalid port number.")
        return

    try:
        sock.bind((ip, int(port)))
    except socket.error as msg:
        print("Bind failed. Error Code : %s" % (msg))
        return

    print("Socket bind complete")
    sock.listen(5)
    print("Socket now listening")

    start_new_thread(accept_clients, (sock,))

def get_input():
    while True:
        data = input("cmd> ")
        print(data)


start_socket('localhost', 5555) 
get_input() 
可以在此处找到它正在执行的操作的图片:


主题行(关于
sys.stdout
的缓冲,默认情况下,
print
写入)中的问题的答案基本上是否定的:每个线程与相同的
sys.stdout
对象对话,该对象通常只有一个缓冲区,当然,如果您愿意,您可以更改
sys.stdout
,您可以为
print()
提供
file=which
参数

然而,这一具体部分是可以解释的:

但当我尝试在控制台中键入任何内容时,控制台上来自套接字的文本将被删除。我想把插座上的所有东西都保留在屏幕上

import sys
import socket
from _thread import *

def recv_data(conn):
    while True:
        data = conn.recv(256)
        print(data)

def accept_clients(sock):
    while True:
        conn, addr = sock.accept()
        print("\nConnected with %s:%s\n" % (addr[0], str(addr[1])))
        start_new_thread(recv_data, (conn,))

def start_socket(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print("Socket created")

    try:
        port = int(port)
    except ValueError:
        print("Invalid port number.")
        return

    try:
        sock.bind((ip, int(port)))
    except socket.error as msg:
        print("Bind failed. Error Code : %s" % (msg))
        return

    print("Socket bind complete")
    sock.listen(5)
    print("Socket now listening")

    start_new_thread(accept_clients, (sock,))

def get_input():
    while True:
        data = input("cmd> ")
        print(data)


start_socket('localhost', 5555) 
get_input() 
默认情况下,Python的输入读取器通过
readline
库。有多个不同的readline库,它们具有不同的行为,但大多数都提供输入历史记录、行编辑和其他奇特的功能。他们倾向于通过在终端窗口中移动光标来实现这些奇特的功能,假设您首先使用某种终端窗口,并且有时使用“清除到行尾”操作。这些操作通常会干扰、覆盖或擦除在这些花式技巧之前、期间和/或之后发生的其他输出


根据您的操作系统、终端仿真器以及Python使用的readline库的不同,具体细节会有很大的不同。

我还没有看到逻辑问题,所以可能是技术细节。我也不太清楚你期望看到的是什么以及你看到的是什么。也许你可以提供这些信息(通过扩展你的帖子)?顺便说一句,
\u thread
通常不用于高级程序。考虑使用模块<代码>线程> <代码>。它提供了一个很好的
线程
类,比
\u线程
类更容易处理。我尝试了你的代码,但无法重现该问题。这段代码的所有内容看起来都和我预期的完全一样(例如,打印通过连接到达的数据时,提示符不会向下移动,等等)。@Alfe您使用的是Python 3.7.1吗?我知道具体的版本可能并不重要。我会用更多的信息更新我的帖子有没有办法找到这些信息?我的程序的一个版本在2.x上正常运行。我把东西转换成了3.x,在这个过程中我一定删除了一些重要的东西。但我已经尽可能地做到了这一点,我只是不确定它会是什么,不确定你能说多少。有关基线,请参阅。这是Windows问题。然后避免使用
input()
。如果您使用的是直接的
sys.stdin.readline()
readline库不会干扰您的输入。您将拥有默认的编辑选项,可能没有什么比退格更奇特的了。没有光标键等,但至少它会将光标留在其他线程放置的位置。这就是答案。我不久前开始想,我需要在Linux上测试它。总是遇到一些设置环境的路障,放弃了,并认为如果它在Windows上工作,那么我应该能够让它工作。事实证明,我应该更加努力,节省自己3天的工作时间。毕竟,这个程序无论如何只能在Unix上运行,所以我应该在Unix上启动它。把它记下来作为一个教训。提交它,我会接受它作为一个答案。再次感谢你的帮助。