由于最初的线程(使用Linq to SQL的多线程)已经变得很老了,我以为我会在类似的主题上发布另一个问题.考虑一种场景,其中DomainService公开了许多方法来从SQL Server数据库中检索数据.显然,在多用户场景中,同时有多个请求进入,人们不得不期望this.DataContext并行使用,开发人员无需控制或额外的工作来处理这些多个请求.那么,如果我将顺序的LINQ查询放入Parallel.Invoke()中,那么所有的地狱都会破裂,我得到的是"已经有一个与此命令关联的开放DataReader,必须首先关闭它".错误......?
为了演示,这有效:
List<Data> retVal = new List<Data>();
retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList());
retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList());
retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D}).ToList());
Run Code Online (Sandbox Code Playgroud)
......但这不是:
List<Data> retVal = new List<Data>();
Parallel.Invoke(
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList()),
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList()),
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D})).ToList());
Run Code Online (Sandbox Code Playgroud)
不要介意List不是线程安全的,因为错误来自SQL数据连接.
任何见解和解释将不胜感激.
有谁知道是否可以使用OpenMP与OCaml源代码?
或者与OCaml兼容的另一个应用程序/工作环境,允许我运行利用多个内核的并行程序?
如果有,怎么样?你有一个简单的例子吗?
我有一个Parallel.ForEach()循环,它接受一个URL列表并下载每个URL以进行一些额外的处理.在我的循环之外,我已经声明了一个循环计数器变量,并且在循环体内我使用Interlocked.Increment()认为这将是保持"线程安全"方式的最佳方法,即在执行每个循环交互时增加计数.
int counter = 0;
Parallel.ForEach(urlList, (url, state) =>
{
// various code statments
Interlocked.Increment( ref counter );
Debug.WriteLine(" ......... counter: " + counter);
});
Run Code Online (Sandbox Code Playgroud)
我原以为我会看到类似的东西:
......... 1
......... 2
......... 3
......... 4
......... 5
.........
.........
......... n
Run Code Online (Sandbox Code Playgroud)
但我得到的是16"......... 0"(这是因为我有一个双核四核计算机,有8个本机核心,但是启用了超线程,总共有16个核心).然后我将开始看到计数器在大多数情况下正常递增,但有时我会在Debug输出中看到重复或甚至三重计数器值.
使用Parallel.ForEach()计算循环迭代的最佳方法是什么?谢谢你的建议.
我有三个嵌套循环但只有最里面的可并行化.外圈和中圈循环条件取决于最内圈的计算,因此我不能改变顺序.
我在最里面的循环之前使用了一个OPENMP pragma指令,但是两个线程的性能比一个线程的性能差.我想这是因为在外循环的每次迭代中都会创建线程.
有没有办法在外部循环外创建线程,但只是在最里面的循环中使用它?
提前致谢
我只是无法理解他们之间的差异......
SPMD在编程级别和SIMD在硬件级别?
例子会很好!
谢谢
在过去的6年里,我一直在使用C和FORTRAN进行编程,但直到现在我才进行了串行编程.我现在想切换到并行程序设计,但我还没有找到一本可以帮助我实现这一目标的书.我看过Chandra关于OpenMP中并行编程的书和Michael J. Quinn关于使用Open Mp和MPI编写C语言的书,但我想知道是否有更好的替代这两个.提前致谢!
普拉香特
我正在为大型网站迁移做一些准备工作。
该数据库的大小约为10GB,几个表包含超过1500万条记录。不幸的是,由于我的职权范围之外的客户关系,它仅以SQL格式出现在一个大的mysqldump文件中,但是您知道如何进行。我的目标是最大程度地减少停机时间,从而尽快导入数据。
我试图像这样使用标准的MySQL CLI接口:
$mysql database_name < superhuge_sql_file -u username -p
Run Code Online (Sandbox Code Playgroud)
但是,这非常慢。
为了加快处理速度,我使用awk将文件与相关数据一起拆分为每个表的块,并构建了一个小shell脚本来尝试并行导入表,如下所示:
#!/bin/sh
awk '/DROP TABLE/{f=0 ;n++; print >(file="out_" n); close("out_" n-1)} f{ print > file}; /DROP TABLE/{f=1}' superhuge.sql
for (( i = 1; i <= 95; i++ ))
do
mysql -u admin --password=thepassword database_name < /path/to/out_$i &
done
Run Code Online (Sandbox Code Playgroud)
值得一提的是,这是一个“使用一次并销毁”脚本(脚本中的密码等)。
现在,这可以正常工作,但在四核服务器上目前尚需3个多小时才能完成。这些表确实是并行导入的,但不是一次全部导入,在此过程中尝试通过CLI获取MySQL服务器信息非常缓慢。我不知道为什么,但是在此过程中尝试使用相同的mysql用户帐户访问表时挂起。max_user_connections是无限的。
我已在my.cnf中将最大连接数设置为500,但未在此服务器上配置MySQL。
我四处寻找,但是想知道是否有任何MySQL配置选项可以帮助加快此过程,或者我错过的任何其他方法都可以更快地完成。
我想在线程之间共享数据,并在最后一个用户完成后自动删除它.这似乎在大多数情况下boost::interprocess::shared_ptr在一个boost::fixed_managed_shared_memory段中使用:但并非总是如此.
那么,是boost::interprocess::shared_ptr线程(和进程间) - 安全吗?
如果我在固定地址使用我的共享内存(我很确定这在我的64位(井,48位)地址空间中是可以的),是否可以使用普通boost::shared_ptr(这是线程安全)而不是?
一些澄清:
我使用的指针类型是plain void*,(我的共享内存映射到固定地址).
线程安全的问题是关于引用计数 - 即,是否允许同时复制/销毁在不同进程中同一事物的共享指针.不能访问不同线程中的相同共享指针,也不能访问指针.
在jvm中搜索Web并发时,我发现了有关为Scala/Java搜索非阻塞IO库的问题.
有什么问题?如果我想向文件/套接字发送内容,我可以启动单独的线程来完成这项工作.
我知道使用基于事件的线程可能存在问题 - 因为整个系统可能被阻止.但它是否引用了JVM/Scala?
补充:
如果我错了,请纠正我:
我认为当你需要以异步方式调用某些IO函数时,需要进入单独的进程或系统(重)线程.我对吗?
所以 - 所有关于用通用语言解决这类问题的问题都涉及到创建和管理单独的进程或线程.因此,该语言的唯一便利是创建一些线程池,这些线程将被分配给异步中的IO操作.
所以我的假设是.
句子:语言X比Y更好,因为调用异步IO操作不会阻止虚拟机是错误的,因为在支持系统线程的每种语言中都有管理NIO的可能性,唯一的区别是语言X对此有更好的支持.内置库/语言功能.
我的代码看起来像这样:
from joblib import Parallel, delayed
# prediction model - 10s of megabytes on disk
LARGE_MODEL = load_model('path/to/model')
file_paths = glob('path/to/files/*')
def do_thing(file_path):
pred = LARGE_MODEL.predict(load_image(file_path))
return pred
Parallel(n_jobs=2)(delayed(do_thing)(fp) for fp in file_paths)
Run Code Online (Sandbox Code Playgroud)
我的问题是是否LARGE_MODEL会在循环的每次迭代中进行腌制/取消腌制。如果是这样,我如何确保每个工作人员都缓存它(如果可能的话)?