我在这里有一个非常简单的函数,我试图在其中运行和测试,但是,它不会输出任何内容,也没有任何错误。
我多次检查了代码,但没有任何错误。
我打印了作业,这就是我得到的:
[<Process(Process-12, stopped[1])>,
<Process(Process-13, stopped[1])>,
<Process(Process-14, stopped[1])>,
<Process(Process-15, stopped[1])>,
<Process(Process-16, stopped[1])>]
这是代码:
import multiprocessing
def worker(num):
print "worker ", num
return
jobs = []
for i in range(5):
p = multiprocessing.Process(target = worker, args = (i,))
jobs.append(p)
p.start()
这是我期待的结果,但它没有输出任何内容:
Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
评论显示 OP 使用 Windows 以及 Spyder。由于 Spyder 重定向stdout
并且 Windows 不支持forking https://docs.python.org/2.7/library/os.html#os.fork,新的子进程不会打印到 Spyder 控制台中。这仅仅是因为以下事实:stdout
新子进程的标准输出是Python的普通标准输出,也可以在sys.__stdout__
.
有两种选择:
使用logging https://docs.python.org/2/library/logging.html模块。这将包括创建所有消息并将其记录到一个或多个文件中。使用单个日志文件可能会导致输出出现轻微乱码的问题,因为进程会同时写入该文件。每个进程使用单个文件可以解决这个问题。
不使用print
在子进程中,但只是将结果返回给主进程。要么通过使用queue https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue (or multiprocessing.Manager().Queue()
因为分叉是不可能的)或更简单地依靠多处理池 https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map map
功能,请参见下面的示例。
使用池的多处理示例:
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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)