当前位置:网站首页>julia系列6:并行计算
julia系列6:并行计算
2022-08-02 15:50:00 【IE06】
1 协程/任务
1.1 定义
协程也称为任务,如果一个计算以任务的方式执行,那它就很可能会被其他任务中断,原先的任务在恢复后,会从被中断的地方继续工作。
这种过程看似很像函数调用,但有两点不同:1)任务切换不需要任何空间,因此可以完成任意数量任务的切换,而且无需考虑堆栈问题。2)任务切换可以按照任何顺序来进行。
任务比较适合生产者-消费者模式,一个过程用来生产值,另一个用来消费值。消费者不能简单的调用生产者来得到值,因为两者的执行时间不一定协同,但是在任务中,两者则可以正常运行。
1.2 Channel
Julia中提供了Channel来解决生产者消费者的协同问题,其实Channel就是一个FIFO(first-in first-out)队列。使用put!和take!(或是fetch,不删除)函数来具体实现。任务的一个特性就是随着任务的结束,channel对象会自动关闭,无需人为干预。
如果一个 Channel 是空的,读取的 task(即执行 take! 的task)会被阻塞直到有新的数据准备好了;如果一个 Channel 是满的,那么写入的 task(即执行 put! 的 task)则会被阻塞,直到 Channel 有空余。在控制台里面表现为堵塞住,无法继续执行命令
isready 可以用来检查一个 channel 中是否有已经准备好的元素,而等待一个元素准备好 则用 wait。
Channel也可以接收一个函数,介绍及示例如下:

接下来看下任务的调度。用@task定义,然后用schedule进行调度。
2 线程
使用Threads.nthreads()查看当前的线程数,默认是启动一个线程。
使用export JULIA_NUM_THREADS=4(Linux OSX)或set JULIA_NUM_THREADS=4(Windows)来设置启动4个线程。当我们要在Jupyter中使用多个线程时,可以在Julia的运行目录中下打开命令行,先设置线程数,再启动Julia。
其中Ref和[]分别是取地址和引用。
3 进程
多进程也叫多核心或者分布式处理,就是用一个CPU的多个核心或者多个CPU进行编程。使用julia -p n启动多进程,也可以进入后添加。
Julia 中的分布式编程基于两个基本概念:远程引用(remote references)和远程调用(remote calls)。远程引用是一个对象,任意一个进程可以通过它访问存储在某个特定进程上的对象。远程调用指是某个进程发起的执行函数的请求,该函数会在另一个(也可能是同一个)进程中执行。
远程引用有两种类型:Future 和 RemoteChannel。
一次远程调用会返回一个 Future 作为结果。
远程调用会立即返回;也就是说,执行远程调用的进程接下来会继续执行下一个操作,而远程调用则会在另外的进程中进行。你可以通过对返回的 Future 执行 wait 操作来等待远程调用结束,然后用 fetch 获取结果。
对于 RemoteChannel 而言,它可以被反复写入。
例如,多个进程可以通过引用同一个远程 Channel 来协调相互之间的操作。
每个进程都有一个对应的 id,提供 Julia 交互环境的进程的 id 永远是1。我们把用来执行并行任务的进程称为 “worker”,假如总共只有一个进程,那么进程1就被认为是 worker,否则,除了进程1以外的进程都称作 worker。
边栏推荐
猜你喜欢
随机推荐
NC52 有效括号序列
从Oracle日志解析学习数据库内核原理
NC231 只出现一次的数字
MPLS实验
Thinkpad E430c使用u盘安装系统
JZ15 二进制中1的个数
CefSharp practical demonstration
多商户商城系统功能拆解20讲-平台端分销概况
再见Attention:建模用户长期兴趣的新范式
JZ69 跳台阶
【2022河南萌新联赛第(四)场:郑州轻工业大学】【部分思路题解+代码解析】
Qt | 关于QPalette的使用
关于小程序TabBar跳转页面跟TabBar标签栏的icon不对应的分析(debug)
Mysql 查询语句中where字段= '' 作用是什么 ?如何实现多条件查询
想要白嫖正则是吧?这一次给你个够!
DevOps开发工具对比
Mobius inversion study notes
11.2-HJ86 求最大连续bit数
莫比乌斯反演学习笔记
【[USACO06NOV]Corn Fields G】【状压DP】








