Python 个线程和字符串
Python threads and strings
我是线程和多处理的新手。我有一些代码,我在其中启动了一个进程,我希望输出显示类似这样的活动等待状态
wating....
代码与下面类似:
导入线程
导入时间
class ThreadExample(object):
def __init__(self):
self.pause = True
threading.Thread(target=self.second_thread).start()
# Some other processes
print("Waiting", end="")
while self.pause:
time.sleep(1)
print(".", end="")
print("Hooray!")
def second_thread(self):
print("timer started")
time.sleep(3)
self.pause = False
print("timer finished")
if __name__ == "__main__":
ThreadExample()
当我运行上面的代码时,我收到输出:
timer started
Do something else..timer finished
.
Hooray!
没什么大惊小怪的,只是只有 'timer started' 出现在开头,其余文字瞬间出现在结尾。
如果我将 print(".", end="") 行更改为 print("."),我会收到以下输出:
timer started
Do something else.
.
timer finished
.
Hooray
圆点以 1 秒为增量出现,这是我的意图。
有没有办法让 'Waiting...' 在一行中没有 end=""?
其次,我猜这与 print() 函数的内部结构有关,如果不是,我是否应该以其他方式执行线程?我不认为问题出在 GIL 上,因为我已经尝试 multiprocess.Process 并得到了相同的结果。
这可能是由于 print
缓冲。它在 \n
和其他一些情况下(如缓冲区溢出或程序退出)被刷新。而不是 print
试试这个:
import sys
def unbuffered_print(msg):
sys.stdout.write(msg)
sys.stdout.flush()
...
unbuffered_print('.')
无处不在。
我是线程和多处理的新手。我有一些代码,我在其中启动了一个进程,我希望输出显示类似这样的活动等待状态
wating....
代码与下面类似:
导入线程 导入时间
class ThreadExample(object):
def __init__(self):
self.pause = True
threading.Thread(target=self.second_thread).start()
# Some other processes
print("Waiting", end="")
while self.pause:
time.sleep(1)
print(".", end="")
print("Hooray!")
def second_thread(self):
print("timer started")
time.sleep(3)
self.pause = False
print("timer finished")
if __name__ == "__main__":
ThreadExample()
当我运行上面的代码时,我收到输出:
timer started
Do something else..timer finished
.
Hooray!
没什么大惊小怪的,只是只有 'timer started' 出现在开头,其余文字瞬间出现在结尾。
如果我将 print(".", end="") 行更改为 print("."),我会收到以下输出:
timer started
Do something else.
.
timer finished
.
Hooray
圆点以 1 秒为增量出现,这是我的意图。
有没有办法让 'Waiting...' 在一行中没有 end=""?
其次,我猜这与 print() 函数的内部结构有关,如果不是,我是否应该以其他方式执行线程?我不认为问题出在 GIL 上,因为我已经尝试 multiprocess.Process 并得到了相同的结果。
这可能是由于 print
缓冲。它在 \n
和其他一些情况下(如缓冲区溢出或程序退出)被刷新。而不是 print
试试这个:
import sys
def unbuffered_print(msg):
sys.stdout.write(msg)
sys.stdout.flush()
...
unbuffered_print('.')
无处不在。