31

我在下面有一段代码,它创建了几个线程来执行一项任务,它本身就可以很好地工作。但是,我很难理解为什么我在函数中调用的打印语句在所有线程完成并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'
4

3 回答 3

34

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

print('Your text', flush=True)

于 2017-05-02T11:00:15.183 回答
21

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

import sys

print 'starting'
sys.stdout.flush()

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

于 2013-08-14T14:33:06.550 回答
3

遇到了很多关于这个问题和输出乱码(尤其是在 Windows 下向输出添加颜色时..),我的解决方案是拥有一个消耗队列的专有打印线程

如果这仍然不起作用,请按照@Or Duanflush=True的建议添加到您的打印语句

此外,您可能会发现“最正确”,但使用线程显示消息的一种强硬方法是使用logging可以包装队列(并异步写入许多地方,包括标准输出)或写入系统级的库队列(Python 之外;可用性很大程度上取决于操作系统支持)

import threading
from queue import Queue

def display_worker(display_queue):
    while True:
        line = display_queue.get()
        if line is None:  # simple termination logic, other sentinels can be used
            break
        print(line, flush=True)  # remove flush if slow or using Python2


def some_other_worker(display_queue, other_args):
    # NOTE accepts queue reference as an argument, though it could be a global
    display_queue.put("something which should be printed from this thread")


def main():
    display_queue = Queue()  # synchronizes console output
    screen_printing_thread = threading.Thread(
        target=display_worker,
        args=(display_queue,),
    )
    screen_printing_thread.start()

    ### other logic ###

    display_queue.put(None)  # end screen_printing_thread
    screen_printing_thread.stop()
于 2019-09-05T16:31:29.077 回答