Python多线程打印语句延迟到所有线程完成执行

Python多线程打印语句延迟到所有线程完成执行,python,multithreading,Python,Multithreading,我在下面有一段代码,它创建了几个线程来执行一项任务,这项任务本身运行得非常好。然而,我很难理解为什么我在函数中调用的print语句在所有线程完成并且调用print'finished'语句之前不会执行。我希望在线程执行时调用它们。有什么简单的方法可以做到这一点吗?为什么首先要这样做 def func(param): time.sleep(.25) print param*2 if __name__ == '__main__': print 'starting execut

我在下面有一段代码,它创建了几个线程来执行一项任务,这项任务本身运行得非常好。然而,我很难理解为什么我在函数中调用的print语句在所有线程完成并且调用
print'finished'
语句之前不会执行。我希望在线程执行时调用它们。有什么简单的方法可以做到这一点吗?为什么首先要这样做

def func(param):
    time.sleep(.25)
    print param*2

if __name__ == '__main__':
    print 'starting execution'
    launchTime = time.clock()
    params = range(10)
    pool=multiprocessing.Pool(processes=100) #use N processes to download the data
    _=pool.map(func,params)
    print 'finished'

这是由于标准输出缓冲造成的。您仍然可以刷新缓冲区:

import sys

print 'starting'
sys.stdout.flush()

您可以找到有关此问题的更多信息。

对于python 3您现在可以像这样使用
flush
参数:


print('Your text',flush=True)

在这方面遇到了很多问题,输出出现了乱码(特别是在Windows下向输出添加颜色时),我的解决方案是使用一个独占的打印线程,该线程占用一个队列

如果这仍然不起作用,也可以按照或Duan的建议将
flush=True
添加到打印语句中

此外,您可能会发现“最正确”的方法,但使用线程显示消息的一种高压方法是使用
日志记录
库,该库可以(异步写入多个位置,包括stdout)或(在Python之外;可用性在很大程度上取决于OS支持)

导入线程
从队列导入队列
def显示工作(显示队列):
尽管如此:
line=display\u queue.get()
如果line为None:#简单的终止逻辑,可以使用其他Sentinel
打破
打印(行,flush=True)#如果速度慢或使用Python2删除flush
定义一些其他工作者(显示队列、其他参数):
#注意:接受队列引用作为参数,尽管它可以是全局引用
display_queue.put(“应该从此线程打印的内容”)
def main():
display_queue=queue()#同步控制台输出
丝网印刷线程=线程。线程(
目标=显示\u工作者,
args=(显示队列,),
)
屏幕\打印\线程。开始()
###其他逻辑###
显示_队列.放置(无)#结束屏幕_打印_线程
丝网印刷线程停止()

我想我应该指出,这是另一个(未回答的)问题,但要简单得多。你的意思是说,所有的打印都一次完成,还是它们的预期顺序实际上颠倒了?如果它们同时运行,则可能是系统缓冲。如果顺序颠倒,这更有趣。事实上,这两件事。打印语句在“finshed”打印后立即出现。缓冲不应改变预期的打印顺序。在print语句之后添加sys.stdout.flush()会导致它们在“finished”之前输出,以及在每个线程完成时打印,而不是等到结束。另外,这是一个非常干净的解决方案!正在接受。这对我不起作用:(。似乎无法处理我的打印队列