[英]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
您在主題行中的問題的答案(關於sys.stdout
緩沖,默認情況下print
寫入)基本上是否定的:每個線程都與同一個sys.stdout
對象對話,盡管當然,它通常只有一個緩沖區如果您願意,您可以更改sys.stdout
,並且您可以向print()
提供file=whatever
參數。
然而,這一特定部分是可以解釋的:
但是,當我嘗試在控制台中鍵入任何內容時,控制台上來自套接字的文本將被刪除。 我想保留套接字中的所有內容以保留在屏幕上。
默認情況下,Python 的輸入閱讀器通過一個readline
庫。 有多個不同的 readline 庫具有不同的行為,但大多數都提供輸入歷史、行編輯和其他奇特的功能。 他們傾向於通過在終端窗口中移動光標來實現這些奇特的功能——假設你首先使用某種終端窗口——並且有時使用“清除到行尾”操作。 這些操作通常會干擾、覆蓋或擦除在這些花哨的技巧之前、期間和/或之后發生的其他輸出。
根據您的操作系統、終端模擬器以及您的 Python 使用的 readline 庫,確切的細節會有很大差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.