use*_*788 8 python printing parallel-processing ipython ipython-parallel
我是IPython的新手,想在运行IPython并行集群功能时将中间结果打印到stdout.(我知道有多个进程,这可能会破坏输出,但这很好 - 它只是用于测试/调试,而我正在运行的进程足够长,以至于不太可能发生此类冲突.)我检查了IPython的文档,但找不到并行化函数打印的示例.基本上,我正在寻找一种方法将子进程的打印输出重定向到主stdout,IPython相当于
subprocess.Popen( ... , stdout=...)
Run Code Online (Sandbox Code Playgroud)
在流程内打印不起作用:
rc = Client()
dview = rc()
def ff(x):
print(x)
return x**2
sync = dview.map_sync(ff,[1,2,3,4])
print('sync res=%s'%repr(sync))
async = dview.map_async(ff,[1,2,3,4])
print('async res=%s'%repr(async))
print(async.display_outputs())
Run Code Online (Sandbox Code Playgroud)
回报
sync res=[1, 4, 9, 16]
async res=[1, 4, 9, 16]
Run Code Online (Sandbox Code Playgroud)
因此计算正确执行,但函数ff中的print语句永远不会打印,即使返回所有进程也是如此.我究竟做错了什么?如何让"打印"工作?
它实际上subprocess.Popen( ... , stdout=PIPE)比你想象的更相似.就像Popen对象有一个stdout属性,你可以读取它来查看子进程的标准输出,AsyncResult有一个stdout属性,包含从引擎捕获的标准输出.它的不同之处在于它AsyncResult.stdout是一个字符串列表,其中列表中的每个项目都是单个引擎的标准输出作为字符串.
所以,开始:
rc = parallel.Client()
dview = rc[:]
def ff(x):
print(x)
return x**2
sync = dview.map_sync(ff,[1,2,3,4])
print('sync res=%r' % sync)
async = dview.map_async(ff,[1,2,3,4])
print('async res=%r' % async)
async.get()
Run Code Online (Sandbox Code Playgroud)
给
sync res=[1, 4, 9, 16]
async res=<AsyncMapResult: ff>
Run Code Online (Sandbox Code Playgroud)
我们可以看到AsyncResult.stdout字符串列表:
print(async.stdout)
['1\n2\n', '3\n4\n']
Run Code Online (Sandbox Code Playgroud)
我们可以看到异步结果的标准输出:
print('async output:')
async.display_outputs()
Run Code Online (Sandbox Code Playgroud)
打印:
async output:
[stdout:0]
1
2
[stdout:1]
3
4
Run Code Online (Sandbox Code Playgroud)
而这里是笔记本与所有这一切证明.
根据您的问题需要注意的一些事项:
async.get())display_outputs()没有返回任何东西 - 它实际上是打印/显示本身,所以print(async.display_outputs())没有意义.| 归档时间: |
|
| 查看次数: |
3784 次 |
| 最近记录: |