任务图与调度方法

Python 中的 Dask 并行编程

James Fulton

Climate Informatics Researcher

可视化任务图

# 创建 2 个 delayed 对象
delayed_num1 = delayed(my_square_function)(3)
delayed_num2 = delayed(my_square_function)(4)

# 相加
result = delayed_num1 + delayed_num2

# 绘制任务图 result.visualize()

一张图展示计算结果的步骤。my-square-function 运行两次,其输出传入 add 函数,返回一个输出。

Python 中的 Dask 并行编程

重叠的任务图

delayed_intermediate = delayed(my_square_function)(3)

# 这两个结果都使用 delayed_intermediate_result
delayed_result1 = delayed_intermediate - 5
delayed_result2 = delayed_intermediate + 4
Python 中的 Dask 并行编程

重叠的任务图

delayed_result1.visualize()

显示结果 1 的任务图。

delayed_result2.visualize()

显示结果 2 的任务图。

Python 中的 Dask 并行编程

重叠的任务图

# 绘制任务图
dask.visualize(delayed_result1, delayed_result2)

一个任务图,显示结果 1 和结果 2 共享一个中间结果。

Python 中的 Dask 并行编程

多线程 vs. 并行处理

数据移动

并行处理
  • 进程有各自的内存空间
多线程
  • 线程共享同一内存空间
Python 中的 Dask 并行编程

多线程 vs. 并行处理

# 对两个大数组求和
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# 使用进程计算
dask.compute(sum1, sum2)
  • 用并行处理较慢

该图显示源于一个 Python 进程的两个数组必须发送到另外两个 Python 进程。

Python 中的 Dask 并行编程

多线程 vs. 并行处理

# 对两个大数组求和
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# 使用线程计算
dask.compute(sum1, sum2)
  • 用多线程更快

该图显示两个数组无需复制。

Python 中的 Dask 并行编程

GIL

全局解释器锁(GIL)——同一时刻只有一个线程可读取 Python 脚本

def sum_to_n(n):
    """Sums numbers from 0 to n"""
    total = 0
    for i in range(n+1):
        total += i
    return total
  • 多线程无助于此
  • 并行处理有效
sum1 = delayed(sum_to_n)(1000)
sum2 = delayed(sum_to_n)(1000)
Python 中的 Dask 并行编程

示例计时——GIL

三张甘特图显示将简单 Python 函数运行 16 次的耗时。在三种调度方法中,进程最快。

Python 中的 Dask 并行编程

会释放 GIL 的函数

  • 如 pd.read_csv() 会释放 GIL
df1 = delayed(pd.read_csv)('file1.csv')
df2 = delayed(pd.read_csv)('file2.csv')
Python 中的 Dask 并行编程

示例计时——加载数据

三张甘特图显示将从 CSV 加载数据的函数运行 16 次的耗时。在三种调度方法中,线程最快。

Python 中的 Dask 并行编程

总结

线程

  • 启动非常快
  • 与主会话共享内存
  • 无需内存传输
  • 受 GIL 限制:一次仅一线程读代码

进程

  • 启动耗时且占内存
  • 各自独立内存池
  • 与彼此及主会话间数据传输很慢
  • 各有自己的 GIL,无需轮流读代码
Python 中的 Dask 并行编程

¡Vamos a practicar!

Python 中的 Dask 并行编程

Preparing Video For Download...