2017-10-15 72 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') 

你能适应这种等待两个用户输入和您要打印到用户的控制台的新消息。