R 语言 | future 包,非阻塞的执行耗时脚本

目的:有一段代码,后面暂时用不到,但是又很耗时,占了当前R session,难道只能等半个小时,等到它结束才能画图?

可以使用R多线程,在支线进程中执行耗时任务,同时不阻塞当前R进程,可以继续干活。

  • 在Rstudio下只能使用 plan(multisession, workers=5)。
  • 在shell R下,还可以使用 plan(multiprocess) ,plan(multicore)[Not supported on Windows.]

Strategy ‘multiprocess’ is deprecated in future (>= 1.20.0) [2020-10-30].
Instead, explicitly specify either ‘multisession’ (recommended) or ‘multicore’. In the current R session, ‘multiprocess’ equals ‘multisession’.

1. 非阻塞的启动R多进程支线任务

# 第一步,开启多线程。只能linux系统,必须开多线程
library(future)
plan(multisession, workers = 3) # 设置为多进程模式

# 第二部:定义耗时任务
save_task <- future({
  pid=Sys.getpid()
  print( paste0("Start ...", pid) )
  #save.image("before.RData")
  Sys.sleep(30) # 模拟耗时1小时
  # 这里保存Rds文件,可能需要花费几十分钟到2个小时
  # save.image("end.RData")
  print( paste0("End...", pid) )
  100 #最后一行是线程的返回值,类似函数的感觉。
})

# 第三步,继续执行其他任务
# 在任务运行时,可以继续执行其他代码,不用等待耗时任务结束
print("正在后台保存文件,可以继续执行其他任务...")

2.检查一个支线任务是否结束

  • 要检查任务的状态,可以使用 value() 函数,它会阻塞直到任务完成并返回结果。
  • resolved() 函数用于检查任务是否已完成,是非阻塞的。
  • 如果想非阻塞地检查结果,可以结合使用 resolved() 和 value() 函数。
# f 是一个future任务 
# 非阻塞地检查是否完成
if (resolved(f)) {
  result <- value(f)  # 如果已完成,获取结果
  print(result)
} else {
  print("任务尚未完成")
}

继续本示例:

resolved(save_task) #非阻塞的查看状态,可以随时查看状态,返回T/F
> value(save_task ) #阻塞的查看返回结果:最后一行的值
[1] "Start ...1389"
[1] "End...1389"

plan(sequential) # 恢复 设置为单进程模式

3. 等待所有支线任务都结束

场景:分别计算每个亚群的高变基因,每个亚群都计算完才能进行下一步。

# arr 是数组,其成员是 future 变量
while(any(!resolved(arr))){ } #阻塞,直到所有支线都出结果:直到任何一个都是T

4. 竞速模式:等待最快的一个线程得到结果

场景:分别使用多个网站下载数据,只要有一个途径下载好,即可开始下一步。

require(future)
#plan(multiprocess)
plan(multisession, workers=5)

longRunningFunction <- function(value, seed=0) {
  set.seed(seed)
  random1<- runif(min= 5 ,max = 30,n = 1)
  Sys.sleep(random1)
  return(value)
}

arr = list()

#changed starting number to 1 since R lists start at 1, not 0
i=1

#If the number of futures generated is more than the number of cores available, then the main thread will block until the first future completes and allows more futures to be started
while(i < 6) {
  arr[[i]] = future(longRunningFunction(i, seed = i), seed = T)
  i = i + 1
}

# 一开始都是F,都没有解析出;最后都是T,都解析了。
while(any(!resolved(arr))){ } #阻塞,直到所有支线都出结果:直到任何一个都是T
#while(all(!resolved(arr))){ } #阻塞,直到有一个支线出结果: 直到至少一个是T[竞速模式]

raceresults_from_future<-lapply(arr[resolved(arr)], value)
print(paste("raceresults_from_future: ",raceresults_from_future) )

5. 传入环境,给多线程的内存消耗瘦身

future开启的支线默认是复制主进程的全部环境,这会导致R的内存开销很大,而其中很大一部分是用不到的拷贝。
可以手动指定某些变量传入执行环境,来达到多进程内存瘦身的目的。

out.a=123

# 1 开启多线程。只能linux系统,必须开多线程
library(future)
plan(multisession, workers = 3) # 设置为多进程模式


# 2 创建环境
#  用于限定多进程拷贝的变量个数,默认是拷贝父进程的整个环境
e1 <- new.env(parent = baseenv())
e1$a=out.a+1902
get("a", e1) #2025 #获取环境中的变量值

assign("b", -3210, envir = e1) #给环境e1中的变量b赋值
get("b", envir = e1) #03210 获取环境中的变量值


# 3 环境作为future的第二个参数
task2 <- future({
  pid=Sys.getpid()
  print(sprintf("task [%s]", pid))
  Sys.sleep(5)
  a+100 #最后一行是线程的返回值,类似函数的感觉。
}, 
  envir = e1 ) #envir 传入变量,否则默认传入父环境

# 可以执行其他任务

# 4 查看多进程结果
resolved(task2) #非阻塞(立刻返回)的查看状态,可以随时查看状态,返回T/F
while(!resolved(task2)){} #阻塞,直到支线任务完成
value(task2 ) #阻塞的(直到有结果)查看返回结果:最后一行的值 2125
task2

plan(sequential) # 恢复 设置为单进程模式

Ref:

  • https://rstudio.github.io/promises/articles/promises_03_overview.html
  • 竞速模式 https://stackoverflow.com/questions/52040744/r-waiting-for-a-list-of-promises-to-resolve

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960178.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React 前端框架实战教程

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 React 是由 Facebook 开发的前端 JavaScript 库&#xff0c;旨在构建高效、灵活的用户界面&#xff0c;尤其适用于单页应用…

MiniMax-01中Lightning Attention的由来(线性注意力进化史)

目录 引言原始注意力线性注意力因果模型存在的问题累加求和操作的限制Lightning AttentionLightning Attention-1Lightning Attention-2 备注 引言 MiniMax-01: Scaling Foundation Models with Lightning Attention表明自己是第一个将线性注意力应用到如此大规模的模型&#…

互联网医院成品|互联网医院软件源码

互联网医院系统带来的好处是显而易见的&#xff0c;其通过先进的互联网技术为医疗行业带来了巨大的变革。以下将从多个方面详细阐述其带来的益处。 一、便捷的医疗服务 互联网医院系统为患者提供了更为便捷的医疗服务。患者无需再亲自前往医院&#xff0c;只需通过电脑、手机等…

unity学习20:time相关基础 Time.time 和 Time.deltaTime

目录 1 unity里的几种基本时间 1.1 time 相关测试脚本 1.2 游戏开始到现在所用的时间 Time.time 1.3 时间缩放值 Time.timeScale 1.4 固定时间间隔 Time.fixedDeltaTime 1.5 两次响应时间之间的间隔&#xff1a;Time.deltaTime 1.6 对应测试代码 1.7 需要关注的2个基本…

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理 安装php8安装ImageMagick1、下载ImageMagick2、解压并安装3、查看是否安装成功 安装imagick扩展包 安装php8 点我安装php8 安装ImageMagick 1、下载ImageMagick wget https://www.imagemagick.org/download/ImageMa…

RabbitMQ模块新增消息转换器

文章目录 1.目录结构2.代码1.pom.xml 排除logging2.RabbitMQConfig.java3.RabbitMQAutoConfiguration.java 1.目录结构 2.代码 1.pom.xml 排除logging <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…

Linux——网络基础(1)

文章目录 目录 文章目录 前言 一、文件传输协议 应用层 传输层 网络层 数据链路层 数据接收与解封装 主机与网卡 数据传输过程示意 二、IP和MAC地址 定义与性质 地址格式 分配方式 作用范围 可见性与可获取性 生活例子 定义 用途 特点 联系 四、TCP和UDP协…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

有限元分析学习——Anasys Workbanch第一阶段笔记(15)接触间隙处理与赫兹接触

目录 0 序言 1 接触的间隙处理 1.1 结果对比 1.2 处理方法 2 赫兹接触 0 序言 本章主要介绍间隙出现时的三种解决方法&#xff0c;齿轮点蚀/表面剥落涉及的赫兹接触的一些理论知识。 1 接触的间隙处理 在实际产品过程中&#xff0c;很多时候由于设计问题&#xff0c;原本…

go单元测试和基准测试

1、单元测试和基准测试 单元测试和基准测试代码开发中的重要环节&#xff0c;良好的单元测试和基准测试&#xff0c;能提升开发质量&#xff0c;对整体开发有非常重要的重要&#xff0c;下面介绍单元测试和基准测试的写法。 2、单元测试和基准测试写法 以排序基本排序算法&a…

自由窗口边框阴影描绘方案汇总-社群讨论学习

背景&#xff1a; 针对很多厂商的自由窗口都有内外阴影效果&#xff0c;针对这样一个需求其实不仔细看可能都看不出来&#xff0c;不过确实也是存在的这种阴影&#xff0c;这里我搞个明显一些的给大家看看&#xff1a; 针对这样一个需求&#xff0c;在我们vip学员群里进行了相…

应用层协议 HTTP 讲解实战:从0实现HTTP 服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; HTTP 协议 &#x1f98b; 认识 URL&#x1f98b; urlencode 和 urldecode 二&#xff1a;&#x1f525; HTTP 协议请求与响应格式 &#x1f98b; HTTP 请求…

深入剖析 Adam 优化器:原理、优势与应用

在深度学习领域&#xff0c;优化器的选择对模型的训练效率和性能起着决定性作用。Adam优化器作为一种自适应优化算法&#xff0c;凭借其根据历史梯度信息动态调整学习率的特性&#xff0c;备受研究者和工程师的青睐。它巧妙融合了RMSProp和Momentum两种优化算法的理念&#xff…

ppp综合实验

IP地址 r1 r2 r3 r4 hdlc封装 pap认证 r2 r3 chap认证 r2 r4 MGRE 主认证 [r1]int Tunnel 0/0/0 [r1-Tunnel0/0/0]ip add 192.168.4.1 24 [r1-Tunnel0/0/0]tunnel-protocol gre p2mp [r1-Tunnel0/0/0]source 12.1.1.1 [r1-Tunnel0/0/0]nhrp entry multicast dynamic [r1-Tu…

C++——list的了解和使用

目录 引言 forward_list与list 标准库中的list 一、list的常用接口 1.list的迭代器 2.list的初始化 3.list的容量操作 4.list的访问操作 5.list的修改操作 6.list的其他操作 二、list与vector的对比 结束语 引言 本篇博客要介绍的是STL中的list。 求点赞收藏评论…

Elasticsearch+kibana安装(简单易上手)

下载ES( Download Elasticsearch | Elastic ) 将ES安装包解压缩 解压后目录如下: 修改ES服务端口&#xff08;可以不修改&#xff09; 启动ES 记住这些内容 验证ES是否启动成功 下载kibana( Download Kibana Free | Get Started Now | Elastic ) 解压后的kibana目…

Ansible自动化运维实战--script、unarchive和shell模块(6/8)

文章目录 一、script模块1.1、功能1.2、常用参数1.3、举例 二、unarchive模块2.1、功能2.2、常用参数2.3、举例 三、shell模块3.1、功能3.2、常用参数3.3、举例 一、script模块 1.1、功能 Ansible 的 script 模块允许你在远程主机上运行本地的脚本文件&#xff0c;其提供了一…

Unity Epplus读取excel表并存入So文件举例

目录 此篇需要你有一定的阅读代码的能力&#xff0c;不然点开了也不知道在做什么 这是读表工具 So文件这么写 使用 此篇需要你有一定的阅读代码的能力&#xff0c;不然点开了也不知道在做什么 在此之前你需要知道epplus是干什么的&#xff0c;然后知道其基本api&#xff0…

Java Web-Cookie与Session

会话跟踪技术 会话跟踪技术是一种在 Web 应用程序中跟踪用户会话状态的机制&#xff0c;它允许服务器在多个请求之间识别和关联属于同一用户的请求&#xff0c;以便在整个会话过程中保持用户相关的信息。以下是几种常见的会话跟踪技术&#xff1a; Cookie 概念&#xff1a;Cook…

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中&#xff0c;我们常常会遇到各种有趣且具有挑战性的问题。今天&#xff0c;我们就来深入探讨一个在实际开发中较为常见的问题&#xff1a;当连续快速发送 Post 请求时&#xff0c;前端会弹出 “数据正在处理&#xff0c;请…