我有一项服务,我必须在从API获取后将大量记录保存到数据库.同时我必须将这些记录从服务返回给调用者.但问题是我在DB中保存记录需要很长时间,因此服务变慢.我搜索了这个并发现了一些并行任务或异步等待的概念.
我是这个概念的新手,对它的用法感到困惑
我调查了一下:
运行多个C#任务异步 http://msdn.microsoft.com/en-us/library/hh191443.aspx
但我不知道该怎么办.请帮助我:
下面是代码:
public List<SearchedItems> SearchItems(string ItemToSearch, string AuthenticationToken)
{
var _list= getRecords from Api //100 records
//Task<int>.Factory.StartNew(() => _objBLLNutritionLog.FillNutritionTable(_tempList)); // also tried this
saveToDb(_list); // need to run this asynchronously Or parallel (Taking long time)
return _list;
}
Run Code Online (Sandbox Code Playgroud)
我想将结果返回给调用者,另一方面想要填充db.请建议.
谢谢
我有一个大型并行(使用MPI)模拟应用程序,它可以生成大量数据.为了评估这些数据,我使用了一个python脚本.
我现在需要做的是运行此应用程序很多次(> 1000)并从结果数据计算统计属性.
到目前为止,我的方法是,使用并行运行的python脚本(使用mpi4py,使用即48个节点)调用模拟代码subprocess.check_call.
我需要这个调用来串行运行我的mpi模拟应用程序.
在这种情况下,我不需要模拟并行运行.然后,python脚本可以并行分析数据,并在完成后将启动新的模拟运行,直到累积大量运行.
目标是
Stub MWE:
multi_call_master.py:from mpi4py import MPI
import subprocess
print "Master hello"
call_string = 'python multi_call_slave.py'
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
print "rank %d of size %d in master calling: %s" % (rank, size, call_string)
std_outfile = "./sm_test.out"
nr_samples = 1
for samples in range(0, nr_samples):
with open(std_outfile, 'w') as out:
subprocess.check_call(call_string, shell=True, stdout=out)
# analyze_data()
# communicate_results()
Run Code Online (Sandbox Code Playgroud)
multi_call_slave.py(这将是C模拟代码):from mpi4py …Run Code Online (Sandbox Code Playgroud) public class Test {
private ExecutorService executor = Executors.newFixedThreadPool(50);
public void startTenThreads() {
for (int i = 0; i < 10; i++) {
executor.execute(new FooWorker(i));
}
}
private final class FooWorker implements Runnable {
private int threadNum;
public FooWorker(int threadNum) {
this.threadNum = threadNum;
}
public void run() {
System.out.println("Thread " + threadNum + " starting");
Thread.sleep(60000);
System.out.println("Thread " + threadNum + " finished");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这些线程并行运行,但输出显示它不是并行运行,而是顺序运行:
Thread 1 starting
Thread 1 finished
Thread 2 starting
Thread 2 finished …Run Code Online (Sandbox Code Playgroud) java parallel-processing concurrency multithreading executorservice
我有一个用PHP编写的守护进程(不是最好的语言,但与我合作),它可以从队列中接收作业,并在需要完成任务时处理它们.对于每个新作业,我使用pcntl_fork()将作业分成一个子进程.在这个子进程中,然后我使用proc_open()来执行长时间运行的系统命令,用于音频转码,完成后直接返回给子进程.完成作业后,子进程将退出并由父进程清理.
为了让这个守护进程始终运行,我使用了暴发.这是我的upstart配置文件:
description "Audio Transcoding Daemon"
start on startup
stop on shutdown
# kill signal SIGCHLD
kill timeout 1200 # Don't force kill the process until it runs over 20 minutes
respawn
exec audio-daemon.php
Run Code Online (Sandbox Code Playgroud)
因为我想在分布式环境中使用这个守护进程,所以我希望能够在不中断任何正在运行的作业的情况下随时关闭服务器.为此,我已经在父进程上使用pcntl_signal()为SIGTERM,SIGHUP和SIGINT 实现了信号处理程序,它等待所有子进程在退出之前正常退出.孩子们也有信号处理程序,但他们会忽略所有杀戮信号.
问题是,根据文件 ......
kill信号节指定的信号被发送到主进程的进程组.(这样就可以杀死属于作业主进程的所有进程).默认情况下,此信号为SIGTERM.
这是令人担忧的,因为在我的子进程中,我通过proc_open()运行系统命令,它也生成新的子进程.因此,每当我运行时sudo stop audio-daemon,这个子进程(恰好是sox)会立即被终止,并且作业返回时会返回错误.显然,sox服从SIGTERM并按照它所说的去做......
最初,我想,"好吧.我只是改变kill signal发送一些本来就被忽略的东西,我只会在主流程中把它拿起来." 但根据手册,默认情况下只有两个信号被忽略:SIGCHLD和SIGURG(可能还有SIGWINCH).但我害怕得到假旗,因为这些也可以通过其他方式触发.
有一些方法可以使用手动调用"实时信号" 来创建自定义信号,但它也说明......
未处理的实时信号的默认操作是终止接收过程.
所以这没有帮助......
您是否可以想到任何方式可以让我的所有子流程在完成之前保持开放状态?我真的不想去挖掘sox的源代码来修改它的信号处理程序,虽然我可以设置SIGCHLD,SIGURG或SIGWINCH作为我的暴发终止信号并祈祷没有别的东西发送给我,我忍不住认为有更好的方法来做到这一点......任何想法?
感谢你的帮助!:)
我有一个网页(通过PL/SQL生成),允许有人打开或关闭远程设备.它们会显示一个设备列表,并使用复选框选择要切换的设备.UTL_HTTP用于与设备通信.目前,这些设备是连续切换的.切换完所有内容后,会向用户发送一封电子邮件.根据选择的设备数量,连续执行此操作可能需要很长时间.所以我正在考虑使用DBMS_SCHEDULER来并行执行切换.
问题是切换过程返回状态,"确定"或失败的原因.我需要将结果包含在用户的电子邮件中.因此,我需要'main'程序来创建SCHEDULER作业,然后在向用户发送电子邮件之前等待它们完成(并以某种方式获取其状态).
这是否可能,没有让每个工作将其状态写入由"主"流程轮询的表格?我已经阅读了DBMS_PIPE对进程间通信的引用,但是没有找到一个很好的例子(即对我有意义的一个)来展示如何做到这一点.
我目前正在使用linux在C++中开发一个分布式软件,它同时在20多个节点中执行.所以我找到的最具挑战性的问题之一是如何调试它.
我听说可以在单个gdb会话中管理多个远程会话(例如,在我创建gdb会话的主节点中以及在我使用gdbserver启动程序的每个其他节点中),是否可能?如果是这样,你能举个例子吗?你知道其他任何办法吗?
谢谢
我有一个包含+100,000个文件的输入文件夹.
我想对它们进行批量操作,即以某种方式重命名所有这些操作,或者根据每个文件名称中的信息将它们移动到新路径.
我想使用Spark来做到这一点,但不幸的是,当我尝试下面这段代码时:
final org.apache.hadoop.fs.FileSystem ghfs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI(args[0]), new org.apache.hadoop.conf.Configuration());
org.apache.hadoop.fs.FileStatus[] paths = ghfs.listStatus(new org.apache.hadoop.fs.Path(args[0]));
List<String> pathsList = new ArrayList<>();
for (FileStatus path : paths) {
pathsList.add(path.getPath().toString());
}
JavaRDD<String> rddPaths = sc.parallelize(pathsList);
rddPaths.foreach(new VoidFunction<String>() {
@Override
public void call(String path) throws Exception {
Path origPath = new Path(path);
Path newPath = new Path(path.replace("taboola","customer"));
ghfs.rename(origPath,newPath);
}
});
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,hadoop.fs.FileSystem不是Serializable(因此可能不能用于并行操作)
知道如何解决它或以其他方式完成它吗?
来自插入符R包的parRF不适合我使用多个核心,这是非常具有讽刺意味的,因为parRF中的par表示并行.我在Windows机器上,如果这是一个相关的信息.我检查过我正在使用最新的关于插入符号和doParallel的最新内容.
我做了一个最小的例子并给出了下面的结果.有任何想法吗?
源代码
library(caret)
library(doParallel)
trCtrl <- trainControl(
method = "repeatedcv"
, number = 2
, repeats = 5
, allowParallel = TRUE
)
# WORKS
registerDoParallel(1)
train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
closeAllConnections()
# FAILS
registerDoParallel(2)
train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
closeAllConnections()
Run Code Online (Sandbox Code Playgroud)
产量
> library(caret)
> library(doParallel)
>
> trCtrl <- trainControl(
+ method = "repeatedcv"
+ , number = 2
+ , repeats = 5
+ , allowParallel = TRUE
+ …Run Code Online (Sandbox Code Playgroud) 当我跑来make -j3并行构建时,我明白了
warning: -jN forced in submake: disabling jobserver mode.
Run Code Online (Sandbox Code Playgroud)
在文档中我发现了警告
如果make检测到子系统可以通信的系统上与并行处理相关的错误条件.
这些错误情况是什么?我该怎么做才能治愈它们或抑制错误信息?
makefile是从CMake生成的,所以我不能(=我不想)编辑makefile.
我目前正在制定一个开放式的提议,为我正在开发的项目带来并行功能,但我遇到了一个障碍find_end.
现在find_end可以描述为:
一种算法,用于搜索[first,last]范围内元素[s_first,s_last]的最后一个子序列.第一个版本使用operator ==来比较元素,第二个版本使用给定的二元谓词p.
它的要求由cppreference列出.现在我没有问题并行find/ findif/ findifnot等等.这些可以很容易地分成异步执行的单独分区,我没有遇到任何麻烦.问题find_end是将算法拆分成块不是解决方案,因为如果我们说一个向量:
1 2 3 4 5 1 2 3 8
我们想要搜索1 2.
好的,首先我将矢量异步分隔成块,然后只搜索每个块中的范围吧?看起来很容易,但是如果由于某种原因只有3个可用内核会发生什么,所以向量分为3个块:
1 2 3| 4 5 1|2 3 8
现在我遇到了问题,第二个1 2范围被分成不同的分区.这将导致许多无效结果,因为有些x核心最终会将搜索结果拆分为y不同的分区.我想我会search chunks -> merge y chunks into y/2 chunks -> search ->在递归样式搜索中做某种事情,但这看起来效率很低,这个算法的重点是提高效率.我也许会过度思考这种折磨
tl; dr,有没有办法以find_end我不想的方式并行化?