我编写了一个多线程程序,它通过大量浮点运算来执行一些CPU繁重的计算.更具体地说,它是一个逐帧比较动画序列的程序.即它将动画A中的帧数据与动画B中的所有帧进行比较,对于动画A中的所有帧.我对不同动画并行执行此强化操作,因此程序可以处理AB对,BC对和CA对在平行下.该程序使用QtConcurrent和"map"函数,该函数将带有运动的容器映射到函数上.QtConcurrent为我管理线程池,我正在使用英特尔四核处理器,因此它产生了4个线程.
现在,问题是我的进程会破坏我的CPU.用法是100%不变的,如果我在一个足够大的运动集上运行我的程序(非分页区域中的页面错误),我实际上得到了一个蓝屏死机.我怀疑这是因为我的电脑超频了.但是,这可能是因为我编写程序的方式吗?我用来测试机器稳定性的一些非常密集的benchamrking工具从未使我的PC崩溃.有没有办法控制我的程序如何使用我的CPU来减少负载?或许我误解了我的问题?
我一直在阅读并思考这个问题.嗡嗡声似乎是在多核未来,功能语言将变得更受欢迎.我是函数式编程的相对noob.我唯一的接触是学术性的,并没有足够的复杂性来真正让这类语言顺其自如.
因此,据我所知,纯函数可以轻松,透明地并行化.这是一个很棒的功能,因为它意味着编写线程代码没有麻烦.但是,它似乎没有给串行代码提供太多帮助.
Example:
fooN( ... (foo3(foo2(foo1(0)))))
Run Code Online (Sandbox Code Playgroud)
像这样的串行呼叫似乎是一个常见的,有时是不可避免的问题.对我来说,这些是并行化如此困难的根本原因.有些任务只是(或似乎是)高度连续的.拥有"功能性思维"是否可以让您更好地分解一些看似串行的任务?现有的任何功能语言是否提供透明机制以更好地并行化高度串行代码?最后,函数式语言本质上是否比OO或命令式语言更具可并行性,为什么?
有没有办法在同一台计算机上的MATLAB进程之间共享内存?
我在多核计算机上运行几个MATLAB进程(运行Windows,如果重要的话).它们都使用相同的巨大输入数据.在内存中只有一个副本就好了.
编辑:不幸的是,每个进程都需要访问整个巨大的输入数据,因此没有办法划分数据并解决问题.
我在10G 3节点RAC上使用Oracle并行查询功能,其中每个节点都是16 CPU机器.问题是,如何查看在所有3个节点上执行查询的Oracle进程的实际数量?
如果两个线程同时尝试写入同一个地址,那么并发写入后的值是否保证是线程尝试写入的值之一?或者是否可以获得这些位的组合?
另外,当位处于不稳定状态时,另一个线程是否可以读取存储器地址?
我猜这个问题可归结为如果对单个内存地址的读取或写入在硬件级别是原子的.
我正在对GridSearchCV模型进行一些分析(顺便说learning_curve一句,同样的问题也会发生),并将详细参数设置为 2。我在笔记本中得到的唯一输出是看似任意点的一些次要进度日志,它只是打印“完成”当内核空闲时。
如果我使用 n_jobs (1) 的默认值,则输出会正确显示在笔记本中,但在并行处理时会发生这种情况:
内核运行时,详细日志会打印在控制台中。
有什么办法可以在笔记本上打印详细的进度日志吗?
如果有更好的方法从 sklearn 获取实时进度日志(也许是 tqdm),那也可以。
这可能是一个相当基本的问题。我正在学习网络应用程序开发的基础知识以及在这方面的并发性和并行性。
如果我启动 Flask Web 应用程序并将 Gunicorn 设置为 1 个工作线程:
gunicorn -w 1 server:app
Run Code Online (Sandbox Code Playgroud)
这是否总是意味着只有一个进程在运行我的应用程序?或者这不是确定的,有些工作人员可能不仅使用线程、greenlet 等,而且还会为我的应用程序生成一个完整的附加进程?
对于后者,这是否也适用于sync或gevent工人,或者这些总是一个过程?
python parallel-processing concurrency web-applications gunicorn
我习惯future_lapply()在 Linux 机器上并行我的代码。如果我提前终止进程,则只有一个工作线程被释放,并且并行进程将继续存在。我知道我可以输入tools::pskill(PID)结束每个单独的进程,但这很乏味,因为我在 26 个核心上运行。
是否有办法从 R 对 linux 进行系统调用来获取所有活动的 PID?
future_lapply我是这样设置的:
# set number of workers
works <- 26
plan(multiprocess, workers = works)
future_lapply(datas, function(data) {
# do some long processes
}
Run Code Online (Sandbox Code Playgroud)
因为我的并行会话仍在运行。
更新会话信息:
version.string R version 3.6.2 (2019-12-12)
future 1.12.0
future.apply 1.2.0
我必须从 Web API (NCBI entrez) 检索大型数据集,该数据集将我每秒的请求数限制为一定数量,例如 10 个(示例代码将在没有 API 密钥的情况下将您限制为 3 个)。我使用 Furrr 的 future_* 函数来并行化请求以尽快获取它们,如下所示:
library(tidyverse)
library(rentrez)
library(furrr)
plan(multiprocess)
api_key <- "<api key>"
# this will return a crap-ton of results
srch <- entrez_search("nuccore", "Homo sapiens", use_history=T, api_key=api_key)
total <- srch$count
per_request <- 500 # get 500 records per parallel request
nrequest <- total %/% per_request + as.logical(total %% per_request)
result <- future_map(seq(nrequest),function(x) {
rstart <- (x - 1) * per_request
return(entrez_fetch(
"nuccore",
web_history = srch$web_history,
rettype="fasta",
retmode="xml",
retstart=rstart, …Run Code Online (Sandbox Code Playgroud) memory ×2
python ×2
r ×2
c++ ×1
concurrency ×1
furrr ×1
gunicorn ×1
jupyter ×1
jupyter-lab ×1
linux ×1
matlab ×1
oracle ×1
performance ×1
process ×1
qtconcurrent ×1
r-future ×1
scikit-learn ×1