我只是在等待用户输入时如何打印文本。例如,如果我们在聊天应用程序中,我们有一个input(),以便用户可以在接收消息时发送消息和print()。它需要同时发生。我试图使用Threads但它始终停在一个线程。 例如:
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 :(得分: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,但是从单个线程执行。当一个或多个对象可用于写入或读取(或两者)时,想法是等待来自OS的通知。查看select
或selectors
模块以获取更多信息。
这是一个简单的例子。它只需等待一秒钟用户输入。如果收到输入,它只会回传,如果没有收到,则打印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')
您可以对此进行调整,以等待用户输入和要打印到用户控制台的新消息。