为什么在使用python多处理池时会看到额外的换行符?

时间:2014-10-01 13:54:50

标签: python multithreading pool

示例:

from multiprocessing.dummy import Pool as ThreadPool

def testfunc(string):
    print string

def main():

    strings = ['one', 'two', 'three', ...]
    pool = ThreadPool(10)
    results = pool.map(testfunc, strings)
    pool.close()
    pool.join()

if __name__ == '__main__':
    main()

这不会给我们带来明确的结果,只有一行结果:

one
two 
three

但网格,有随机的换行符,比如

one 


two
three

four
five
...

为什么会这样?我可以为每个函数调用输出一个换行符输出我的数据吗?

P.S。有时我甚至没有换行甚至空格! P.P.S.在windows下工作

3 个答案:

答案 0 :(得分:2)

print是非原子操作,因此一个打印可以在中间被另一个打印在另一个进程中断。您可以通过在print周围放置Lock来阻止两个进程同时调用from multiprocessing.dummy import Pool as ThreadPool from multiprocessing import Lock print_lock = Lock() def testfunc(string): print_lock.acquire() print string print_lock.release() def main(): strings = ['one', 'two', 'three', 'four', 'five'] pool = ThreadPool(10) results = pool.map(testfunc, strings) pool.close() pool.join() if __name__ == '__main__': main()

{{1}}

答案 1 :(得分:2)

因为工作人员(根据您正在使用的池中的进程/线程)未同步。你可以使用锁。

或者,您可以在主流程中打印输出,而不是在工作流程中打印输出。

def testfunc(string):
    return string

def main():
    strings = ['one', 'two', 'three', ...]
    pool = ThreadPool(10)
    results = pool.map(testfunc, strings)
    for result in results:
        print result
    pool.close()
    pool.join()

答案 2 :(得分:1)

所有线程都写入相同的输出文件,在这种情况下它是stdout。因此,在一个进程完成写入之前,其他线程也在写入相同的输出文件。相反,您可以从所有线程收集结果并将其打印在main本身,如此

def testfunc(string):
    return string

...
...

    print "\n".join(pool.map(testfunc, strings))