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
task2plan(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
相关文章:
R 语言 | future 包,非阻塞的执行耗时脚本
目的:有一段代码,后面暂时用不到,但是又很耗时,占了当前R session,难道只能等半个小时,等到它结束才能画图? 可以使用R多线程,在支线进程中执行耗时任务,同时不阻塞当前…...
UE学习日志#12 Niagara特效大致了解(水文,主要是花时间读了读文档和文章)
1 核心组件(官方文档阅读) 一些介绍主要来自官方文档Niagara概述 1.1 Systems 官方文档中的描述: Niagara系统是一种容器,可以放入你要构建该效果的所有内容。在这个系统中,你可以搭建不同的构建块来实现总体效果。…...
【数据结构】_链表经典算法OJ:合并两个有序数组
目录 1. 题目描述及链接 2. 解题思路 3. 程序 3.1 第一版 3.2 第二版 1. 题目描述及链接 题目链接:21. 合并两个有序链表 - 力扣(LeetCode) 题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给…...
Mongodb副本集群为什么选择3个节点不选择4个节点
一、容错能力的定义 在副本集中,容错能力是指系统能够容忍多少个节点故障而仍然能够保持服务可用性的能力。这通常与选举机制中的多数投票原则密切相关。 二、三节点副本集的容错能力 在三节点的副本集中,通常有一个主节点和两个从节点。当主节点故障…...
基于 WEB 开发的手机销售管理系统设计与实现内容
标题:基于 WEB 开发的手机销售管理系统设计与实现 内容:1.摘要 摘要:随着智能手机的普及和电子商务的快速发展,手机销售行业面临着越来越多的挑战和机遇。为了提高销售效率和管理水平,本文设计并实现了一个基于 WEB 的手机销售管理系统。该系…...
LeetCode - Google 大模型校招10题 第1天 Attention 汇总 (3题)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145368666 GroupQueryAttention(分组查询注意力机制) 和 KVCache(键值缓存) 是大语言模型中的常见架构,GroupQueryAttention 是注意力…...
Vue3 provide/inject用法总结
1. 基本概念 provide/inject 是 Vue3 中实现跨层级组件通信的方案,类似于 React 的 Context。它允许父组件向其所有子孙组件注入依赖,无论层级有多深。 1.1 基本语法 // 提供方(父组件) const value ref(hello) provide(key, …...
Linux——网络基础(1)
文章目录 目录 文章目录 前言 一、文件传输协议 应用层 传输层 网络层 数据链路层 数据接收与解封装 主机与网卡 数据传输过程示意 二、IP和MAC地址 定义与性质 地址格式 分配方式 作用范围 可见性与可获取性 生活例子 定义 用途 特点 联系 四、TCP和UDP协…...
【记录】日常|从零散记录到博客之星Top300的成长之路
文章目录 shandianchengzi 2024 年度盘点概述写作风格简介2024年的创作内容总结 shandianchengzi 2024 年度盘点 概述 2024年及2025年至今我创作了786即84篇文章,加上这篇就是85篇。 很荣幸这次居然能够入选博客之星Top300,这个排名在我之前的所有年份…...
【二分查找】力扣373. 查找和最小的 K 对数字
给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1: 输入: nums1 [1,7,11], nums2 …...
池化层Pooling Layer
1. 定义 池化是对特征图进行的一种压缩操作,通过在一个小的局部区域内进行汇总统计,用一个值来代表这个区域的特征信息,常用于卷积神经网络(CNN)中。 2. 作用 提取代表性信息的同时降低特征维度,具有平移…...
力扣算法题——11.盛最多水的容器
目录 💕1.题目 💕2.解析思路 本题思路总览 借助双指针探索规律 从规律到代码实现的转化 双指针的具体实现 代码整体流程 💕3.代码实现 💕4.完结 二十七步也能走完逆流河吗 💕1.题目 💕2.解析思路…...
自由学习记录(32)
文件里找到切换颜色空间 fgui中的 颜色空间是一种总体使用前的设定 颜色空间,和半透明混合产生的效果有差异,这种问题一般可以产生联系 动效就是在fgui里可以编辑好,然后在unity中也准备了对应的调用手段,可以详细的使用每一个具…...
VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)
使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办? 很好解决,大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况。 解决方法: winR 然后输…...
「蓝桥杯题解」蜗牛(Java)
题目链接 这道题我感觉状态定义不太好想,需要一定的经验 import java.util.*; /*** 蜗牛* 状态定义:* dp[i][0]:到达(x[i],0)最小时间* dp[i][1]:到达 xi 上方的传送门最小时间*/public class Main {static Scanner in new Scanner(System.in);static f…...
PHP EOF (Heredoc) 详解
PHP EOF (Heredoc) 详解 PHP 中的 EOF(End Of File)是一种非常有用的语法特性,允许开发者创建多行字符串。它特别适合于创建格式化文本,如配置文件、HTML 模板等。本文将详细讲解 PHP EOF 的用法、优势以及注意事项。 什么是 EOF? EOF 是一种特殊的字符串定义方式,它允…...
pyautogui操控Acrobat DC pro万能PDF转Word,不丢任何PDF格式样式
为了将PDF转换脚本改为多进程异步处理,我们需要确保每个进程独立操作不同的Acrobat窗口。以下是实现步骤: 实现代码 import os import pyautogui import time import subprocess import pygetwindow as gw from multiprocessing import Pooldef conver…...
Day32:字符串的复制
在 Python 中,字符串的复制是指创建一个新的字符串,它的内容与原字符串相同。字符串是不可变的对象,这意味着你不能直接修改字符串的内容,但是可以通过复制来创建新的字符串进行操作。字符串的复制在一些情况下非常有用࿰…...
基于Mybatis继承AbstractRoutingDataSource使用自定义注解实现动态数据源
一:实现 方式一:继承AbstractRoutingDataSource使用自定义注解实现 环境:springboot3 MyBatis3 mysql-connector8 DataSourceKeyEnum枚举类 有几个数据源就配置几个枚举类,和数据源数量一一对应 class DataSourceKeyEnum{D…...
ZooKeeper 数据模型
ZooKeeper 数据模型 ZooKeeper 拥有层次化的命名空间,类似分布式文件系统,但每个节点不仅能有子节点,还可关联数据。节点路径为规范的绝对路径,用斜杠分隔,无相对引用。路径命名有如下约束: 路径名不能包…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
Vue 实例的数据对象详解
Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...
生成对抗网络(GAN)损失函数解读
GAN损失函数的形式: 以下是对每个部分的解读: 1. , :这个部分表示生成器(Generator)G的目标是最小化损失函数。 :判别器(Discriminator)D的目标是最大化损失函数。 GAN的训…...
浏览器工作原理01 [#]Chrome架构:仅仅打开了1个页面,为什么有4个进程
引用 浏览器工作原理与实践 Chrome打开一个页面需要启动多少进程?你可以点击Chrome浏览器右上角的“选项”菜单,选择“更多工具”子菜单,点击“任务管理器”,这将打开Chrome的任务管理器的窗口,如下图 和Windows任务管…...
