输入和打印线程python

时间:2017-10-15 04:33:57

标签: python multithreading

我只是在等待用户输入时如何打印文本。例如,如果我们在聊天应用程序中,我们有一个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)

有人可以帮助我吗?

1 个答案:

答案 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的通知。查看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')

您可以对此进行调整,以等待用户输入和要打印到用户控制台的新消息。