评论显示,OP使用Windows和Spyder。由于Spyder重定向stdout,并且Windows不支持forking,因此新的子进程不会打印到Spyder控制台中。这只是因为新子进程的stdout是Python的普通标准输出,也可以在sys.__stdout__中找到。
有两种选择:使用logging模块。这将包括创建所有消息并将其记录到一个或多个文件中。使用单个日志文件可能会导致输出有点混乱,因为进程会并发地写入该文件。每个进程使用一个文件可以解决这个问题。
不是在子进程中使用print,而是简单地将结果返回到主进程。或者使用queue(或者multiprocessing.Manager().Queue(),因为不可能分叉),或者更简单地依赖multiprocessing Pool'smap功能,请参见下面的示例。
池的多处理示例:import multiprocessing
def worker(num):
"""Returns the string of interest"""
return "worker %d" % num
def main():
pool = multiprocessing.Pool(4)
results = pool.map(worker, range(10))
pool.close()
pool.join()
for result in results:
# prints the result string in the main process
print(result)
if __name__ == '__main__':
# Better protect your main function when you use multiprocessing
main()
哪个打印(在主要过程中)worker 0
worker 1
worker 2
worker 3
worker 4
worker 5
worker 6
worker 7
worker 8
worker 9
编辑:如果您迫不及待地等待map函数完成,可以使用imap_unordered并稍微更改命令的顺序,立即打印结果:def main():
pool = multiprocessing.Pool(4)
results = pool.imap_unordered(worker, range(10))
for result in results:
# prints the result string in the main process as soon as say are ready
# but results are now no longer in order!
print(result)
# The pool should join after printing all results
pool.close()
pool.join()