示例:
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下工作
答案 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))