簡體   English   中英

Python 線程是否打印到與主線程不同的緩沖區?

[英]Do Python threads print to a different buffer than the main thread?

我有一個正在處理的項目,但我已將問題帶入下面的一個小示例代碼中。 我首先創建一個套接字,然后生成一個線程來接受連接(這樣我就可以有多個客戶端連接)。 當我收到一個連接時,我會生成另一個線程來偵聽該連接。 我也在一個循環中,它給了我一個提示,我可以在其中輸入任何內容,它會將它打印回給我。

問題在於當我通過套接字接收某些東西時。 它將打印到屏幕上。 但是,當我嘗試在控制台中鍵入任何內容時,控制台上來自套接字的文本將被刪除。 我想保留套接字中的所有內容以保留在屏幕上。

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() 

可以在這里找到它正在做什么的圖片: https : //imgur.com/a/hCWznfE

我啟動了服務器並輸入了提示符 (cmd>)。它接受我的輸入並將其打印回給我。

現在我使用netcat並連接到服務器。服務器顯示客戶端已連接。

我使用netcat向服務器發送消息,服務器顯示。

我回到服務器並開始輸入,然后刪除了來自客戶端的字符串,然后我又回到了提示符處。

您在主題行中的問題的答案(關於sys.stdout緩沖,默認情況下print寫入)基本上是否定的:每個線程都與同一個sys.stdout對象對話,盡管當然,它通常只有一個緩沖區如果您願意,您可以更改sys.stdout ,並且您可以向print()提供file=whatever參數。

然而,這一特定部分是可以解釋的:

但是,當我嘗試在控制台中鍵入任何內容時,控制台上來自套接字的文本將被刪除。 我想保留套接字中的所有內容以保留在屏幕上。

默認情況下,Python 的輸入閱讀器通過一個readline庫。 有多個不同的 readline 庫具有不同的行為,但大多數都提供輸入歷史、行編輯和其他奇特的功能。 他們傾向於通過在終端窗口中移動光標來實現這些奇特的功能——假設你首先使用某種終端窗口——並且有時使用“清除到行尾”操作。 這些操作通常會干擾、覆蓋或擦除在這些花哨的技巧之前、期間和/或之后發生的其他輸出。

根據您的操作系統、終端模擬器以及您的 Python 使用的 readline 庫,確切的細節會有很大差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM