Python-如何阻止线程中断输入?
每当一个线程打印某个内容,并且用户必须输入某个内容时,该线程就会中断他们正在键入的内容并将其放到新行上 例如:Python-如何阻止线程中断输入?,python,Python,每当一个线程打印某个内容,并且用户必须输入某个内容时,该线程就会中断他们正在键入的内容并将其放到新行上 例如: user: hel 12345 lo world 我想看到的是用户输入前的线程打印: 12345 user: hello world 线是随机打印的,所以我不能改变它打印的时间。我不想延迟,因为用户可能在很长一段时间内不会键入任何内容,这将阻止他们看到线程的输出 有什么我可以做的吗?如果您确实希望线程停止直到打印,您可以使用自定义打印和输入功能: lock = threading
user: hel
12345
lo world
我想看到的是用户输入前的线程打印:
12345
user: hello world
线是随机打印的,所以我不能改变它打印的时间。我不想延迟,因为用户可能在很长一段时间内不会键入任何内容,这将阻止他们看到线程的输出
有什么我可以做的吗?如果您确实希望线程停止直到打印,您可以使用自定义打印和输入功能:
lock = threading.Lock()
def myprint(data):
lock.acquire()
print(data)
lock.release()
def myinput():
lock.acquire()
data = input()
lock.release()
return data
否则,我建议您选择。如果您确实希望线程在打印之前停止,您可以使用自定义打印和输入功能:
lock = threading.Lock()
def myprint(data):
lock.acquire()
print(data)
lock.release()
def myinput():
lock.acquire()
data = input()
lock.release()
return data
否则我建议你选择。简短回答:不,你无能为力 详细回答:这要看情况。关于您的程序和正在运行的环境,确实没有足够的信息来建议合适的解决方案 如果您使用的是Linux发行版或Mac OS,您可能有一个支持ncurses的终端 在这种情况下,您可以使用和一些锁定同时将两个或多个线程输出到屏幕的不同部分 注意,您可能需要一次读取一次用户输入,而不是使用Pythons
raw\u input
或类似工具,以保持输出在屏幕上的整洁排列
这里的“输出”指的是从线程打印和将用户输入“回显”到屏幕上(因此您实际上有两个输出源,而不是一个!)简短回答:不,您无能为力 详细回答:这要看情况。关于您的程序和正在运行的环境,确实没有足够的信息来建议合适的解决方案 如果您使用的是Linux发行版或Mac OS,您可能有一个支持ncurses的终端 在这种情况下,您可以使用和一些锁定同时将两个或多个线程输出到屏幕的不同部分 注意,您可能需要一次读取一次用户输入,而不是使用Pythons
raw\u input
或类似工具,以保持输出在屏幕上的整洁排列
这里的“输出”指的是从线程打印和将用户输入“回显”到屏幕上(因此您实际上有两个输出源,而不是一个!)您不能在用户输入之前将其打印出来,但是您可以做的是让其等待轮到自己打印某些内容 这是通过称为
互斥体的同步机制实现的。它也可以称为锁
,Python就是这样
每次您想要打印或获取用户输入时,您所要做的就是阻止一切,通过获得锁,所有其他线程将等待轮到它们,当您返回锁时,只有这样,它们才能获得锁并打印
这应该足以满足您的需要:
#sio.py(同步io)
导入线程
#用于同步IO的锁,全局存储
#dunders警告用户不要触摸这些东西
__io_lock=threading.lock()
#这是有问题的,但让我们保持简单
#让我们用自己的函数覆盖默认函数,并保留旧函数
#只影响这个模块,所以它不应该有问题
__打印
__输入=输入
def打印(*args,**kwargs):
使用_io_锁定:
__打印(*args,**kwargs)
def输入(*args,**kwargs):
使用_io_锁定:
__输入(*args,**kwargs)
#sio.py的末尾
现在您可以导入并使用它
尽管有一点很重要,但它不会影响Python,除了IO,因为GIL存在,它会阻止线程并阻止它们在尝试打印时执行任何操作,因为在用户输入某个内容并返回锁之前,它们绝对不会执行任何操作
为了避免这种情况,您可以简单地缓冲您想要打印的内容,以防无法获得lock,然后在最终获得lock时一次打印所有内容,但这可能会很混乱,并且取决于您真正想要做什么,因此我将仅提供一个没有这些内容的示例,如果希望线程继续运行,您可以自己实现它
导入线程
导入时间
进口二氧化硅
def noised_thread():
尽管如此:
#线程将等待,直到它可以打印而不打扰任何人
sio.打印(“嘈杂的线程:嘟嘟声”)
时间。睡眠(1)
如果名称=“\uuuuu main\uuuuuuuu”:
线程=线程。线程(目标=线程)
thread.start()
计数=3
对于范围内的i(计数):
#输入获取锁并阻止所有其他打印/输入
sio.input(f{i+1}/{count}:)
thread.join()
您不能让它在用户输入之前打印,但您可以做的是让它等到轮到自己打印东西时再打印
这是通过称为互斥体的同步机制实现的。它也可以称为锁
,Python就是这样
每次您想要打印或获取用户输入时,您所要做的就是阻止一切,通过获得锁,所有其他线程将等待轮到它们,当您返回锁时,只有这样,它们才能获得锁并打印
这应该足以满足您的需要:
#sio.py(同步io)
导入线程
#用于同步IO的锁,全局存储
#dunders警告用户不要触摸这些东西
__io_lock=threading.lock()
#这是有问题的,但让我们保持简单
#让我们用自己的函数覆盖默认函数,并保留旧函数
#只影响这个模块,所以它不应该有问题
__打印
__输入=输入
def打印(*args,**kwargs):
使用_io_锁定:
__打印(*args,**kwargs)
def输入(*args,**kwargs):
使用_io_锁定:
__输入(*args,**kwargs)
#sio.py的末尾
现在您可以导入并使用它
不过,这其中有一点很重要,尽管它不是一件好事