2017-10-15 85 views
1

我只是在如何在等待用戶輸入的同時打印文本。例如,如果我們在聊天應用程序中,我們有一個input(),以便用戶在接收消息時可以發送消息和print()。它需要同步。我試圖使用線程,但它總是停在一個線程。 例子:輸入和打印線程python

def receive(client): 
    threadName = client.getThreadName() 
    while not client.isStopThread(): 
     time.sleep(1) 
     print('test') 
     while (client.isThereMessage()): 
      print('[' + threadName + ']: ' + client.getMessage()) 

和主程序

client.startThread(thread.uid) 
receiveThread = Thread(target = receive(client)) 
receiveThread.deamon = True 
receiveThread.start() 

while True: 
    toSendMessage = input('[' + client.fetchThreadInfo(client.uid)[client.uid].name + ']: ') 
    client.sendMessage(toSendMessage, thread_id=thread.uid, thread_type=thread.type) 

可能有人幫助我嗎?

+0

它保持打印'測試',但沒有'[xx]:'在那裏,我不能寫一些輸入 –

回答

0

您正在錯誤地調用Thread類構造函數。簽名是:

threading.Thread(target=None, args=(), kwargs={}) 

target是函數對象本身,即receive,不receive(client)。你現在調用receive功能與client作爲輸入,然後傳遞返回值該功能的(這似乎是None)作爲target關鍵字參數的構造函數Thread。如果receive函數無限循環,那麼代碼肯定會在Thread構造函數中停頓。

你應該改爲調用Thread構造像這樣:

receiveThread = Thread(target=receive, args=(client,)) 

而且,在一般情況下,你並不需要穿到兩個打印的東西,等待輸入。您可以改爲執行所謂的同步I/O多路複用,這意味着要同時在多個對象上執行I/O,但要從單個線程執行I/O。當一個或多個對象可用於寫入或讀取(或兩者)時,其思想是等待來自操作系統的通知。請查看selectselectors模塊瞭解更多信息。

這是一個簡單的例子。它僅等待用戶輸入一秒鐘。如果收到輸入,它只是回顯,如果沒有收到,它會打印Nothing new

import sys 
import select 
timeout = 1.0 
while True: 
    rlist, _ = select.select([sys.stdin], [], [], timeout) 
    if len(rlist): 
     print(sys.stdin.readline()) 
    else: 
     print('Nothing new') 

你能適應這種等待兩個用戶輸入和您要打印到用戶的控制檯的新消息。