如何阻止Dask LocalCluster工作进程的打印内容输出到控制台?
问题:阻止Dask工作进程的打印内容输出到控制台
我有一个运行时会打印内容的Python函数,希望通过Dask运行它,但不希望工作进程的打印内容直接输出到控制台。简化示例代码如下:
def dask_function(i): print('Ignore me!') return i**2 cluster = LocalCluster(12, processes=True) client = Client(cluster) dask_delays = [] for i in range(10): dask_delays.append(dask.delayed(dask_function)(i)) dask_outs = client.compute(dask_delays)
运行这段代码后,控制台会打印10次“Ignore me!”,请问有什么方法可以阻止这种输出?
解决方案
方法1:重定向工作进程的标准输出/错误流
创建LocalCluster时,通过worker_kwargs参数将工作进程的stdout和stderr重定向到空设备(Linux/macOS用/dev/null,Windows用NUL),彻底丢弃打印内容:
import os from dask.distributed import LocalCluster, Client import dask def dask_function(i): print('Ignore me!') return i**2 # 根据系统选择空设备路径 null_device = '/dev/null' if os.name != 'nt' else 'NUL' cluster = LocalCluster( n_workers=12, processes=True, worker_kwargs={ 'stdout': open(null_device, 'w'), 'stderr': open(null_device, 'w') } ) client = Client(cluster) dask_delays = [dask.delayed(dask_function)(i) for i in range(10)] dask_outs = client.compute(dask_delays)
方法2:在函数层面抑制打印
如果能修改目标函数,直接移除print语句是最直接的方式。若不想改动原函数,可使用装饰器临时重定向函数内的输出:
import contextlib import io from dask.distributed import LocalCluster, Client import dask def suppress_print(func): def wrapper(*args, **kwargs): # 将输出重定向到内存缓冲区,不输出到控制台 with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()): return func(*args, **kwargs) return wrapper @suppress_print def dask_function(i): print('Ignore me!') return i**2 cluster = LocalCluster(12, processes=True) client = Client(cluster) dask_delays = [dask.delayed(dask_function)(i) for i in range(10)] dask_outs = client.compute(dask_delays)
方法3:通过Dask日志配置过滤输出
Dask工作进程的print内容会被日志系统捕获,调整工作进程的日志级别为WARNING及以上,即可隐藏INFO级别的打印内容:
import logging from dask.distributed import LocalCluster, Client import dask # 设置Dask工作进程日志级别,忽略INFO及以下的输出 logging.getLogger('distributed.worker').setLevel(logging.WARNING) def dask_function(i): print('Ignore me!') return i**2 cluster = LocalCluster(12, processes=True) client = Client(cluster) dask_delays = [dask.delayed(dask_function)(i) for i in range(10)] dask_outs = client.compute(dask_delays)
内容的提问来源于stack exchange,提问作者Tom Warner
相关产品推荐
相关产品推荐

