【发布时间】:2013-07-19 09:47:39
【问题描述】:
美好的一天!
我有一个 python 脚本,它创建一个文件列表并在 multiprocess.Pool.map 和线程函数中处理它。线程函数使用外部可执行文件并通过 subprocess.check_call 调用它。这个外部可执行文件将一些信息打印到标准输出。
所以我在阅读此输出时遇到问题 - 有时它很混乱,我无法从中获得任何有用的信息。我已经阅读了 python 中的打印和多线程,但我认为这不完全是我的问题,因为我没有在我的脚本中明确调用 print 函数。
我该如何解决这个问题?谢谢。
另外,我注意到,如果我将脚本的输出重定向到文件,输出根本不会混乱。
[更新]:
如果我运行脚本,这可以正常工作:python mp.py > mp.log
import time, argparse, threading, sys
from os import getenv
from multiprocessing import Pool
def f(x):
cube = x*x*x
print '|Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut %d|'%(cube)
return cube
if __name__ == '__main__':
#file = open('log.txt', 'w+')
parser = argparse.ArgumentParser(description='cube', usage='%(prog)s [options] -n')
parser.add_argument('-n', action='store', help='number', dest='n', default='10000', metavar = '')
args = parser.parse_args()
pool = Pool()
start = time.time()
result = pool.map(f, range(int(args.n)))
end = time.time()
print (end - start)
#file.close()
【问题讨论】:
-
原因是因为不同的进程打印到同一个终端,所以你得到一个线程的一行,而不是第二个线程的一行,而不是第一个线程的另一行,(或者至少就是这样我认为您的问题与“混乱的输出”有关)
-
我该如何解决这个问题?锁没用。我还尝试将所有 print expr 替换为 sys.stdout.write,它也没有帮助。
-
在这种情况下,我想解决方案是让您的外部可执行文件将其输出打印到每个线程的 log.txt 中,这样它就可以工作
-
好的,谢谢,我试试
-
看看是否能解决问题
标签: python multithreading python-2.7 subprocess