我有一个需要很长时间才能初始化的对象。因此我能够在应用程序启动时开始初始化。任何对类上方法的后续调用都需要有一个延迟机制来等待类完成初始化。
我有几个潜在的解决方案,但我对它们中的任何一个都不完全满意。第一个在 while 循环中使用 Task.Delay,第二个使用 SemaphoreSlim 但涉及一些不必要的阻塞。我觉得这一定是一个相当普遍的要求,有人可以就如何最好地管理这个问题提供一些建议吗?
哦顺便说一句,这是一个 Metro 应用程序,所以我们的 API 有限
这是伪代码:
public class ExposeSomeInterestingItems
{
private InitialisationState _initialised;
private readonly SemaphoreSlim _waiter =
new SemaphoreSlim(0);
public async Task StartInitialize()
{
if (_initialised == InitialisationState.Initialised)
{
throw new InvalidOperationException(
"Attempted to initialise ActiveTrackDown" +
"loads when it is already initialized");
}
_initialised =
InitialisationState.StartedInitialisation;
new TaskFactory().StartNew(async () =>
{
// This takes some time to load
this._interestingItems =
InterestingItemsLoader.LoadItems();
_waiter.Release();
_initialised = InitialisationState.Initialised;
});
}
public InterestingItem GetItem(string id) …Run Code Online (Sandbox Code Playgroud) 我在 GNU/Linux 桌面上使用 C++ 编程语言和 GCC。我正在尝试用 C++ 实现一些 PRAM 并行算法。据我了解,在多核 CPU 上使用 OpenMP 或多或少有助于模拟 CREW PRAM 算法。
许多复杂的 PRAM 算法涉及诸如并行前缀求和、排序、对全局地址空间中的向量执行元素操作等操作。
不知何故,经过大约 15 分钟的谷歌搜索后,似乎没有提供此功能的库,即一些开箱即用的基本并行算法或数据结构,如标准模板库。
任何人都可以列出任何这样的库吗?
编辑:本质上,我需要的是与 CUDA 世界中使用的 Thrust 库类似的 OpenMP。http://thrust.github.com/
我正在尝试建立一个分布式处理环境,所有数据都位于一个共享网络驱动器中。我不会向它写入任何内容,只是读取它,因此我们也在考虑对网络驱动器进行写保护。
我记得当我使用 MSSQL 时,我可以将数据库备份到 DVD 并将其作为只读数据库直接加载。
如果我可以在 Postgres 中做这样的事情,我应该能够给它一个像只读 DVD 一样的抽象,一切都会好起来的。
在 Postgres 中是否有可能发生这样的事情,如果没有,还有其他选择吗?(MySQL?sqlite 甚至?)
或者,如果这是不可能的,是否有某种方法可以指定共享文件系统?(让它知道其他进程也在读取它?)
由于各种原因,使用并行 dbms 是不可能的,我需要两个并行运行的 DB 进程......
任何帮助是极大的赞赏。谢谢!!
我试图在Python中同时运行两个方法.其中一个播放声音,另一个录制它.这两种方法都运行良好但我无法弄清楚如何在尝试多处理和线程的同时启动它们.虽然我现在几乎可以肯定它无法通过线程解决.
def listen_to_audio()
def play_audio()
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?(他们不必同时完成,但他们都应该在一秒钟内开始.)
这是代码,抱歉没有在开头发布它:
import pyaudio
import wave
import sys
import time
from math import *
from getopt import *
import threading
def make_sin(f0=1000.,ampl=30000,rate=22050,length=5.):
a = 2. * pi * f0/rate
n = int(rate * length)
wav=''
for i in range(0, n):
f = int(ampl*sin(a*i))
wav += chr(f & 0xFF) + chr((f & 0xFF00) >> 8)
return wav
def play_audio(forHowLong):
data = make_sin(f0=1000.,ampl=30000,rate=22050,length=5.)
p = pyaudio.PyAudio() #sets up portaudio system
stream = p.open(format=p.get_format_from_width(2),
channels=1,
rate=22050,
output=True)
start …Run Code Online (Sandbox Code Playgroud) 以下最小示例...
require(Rmpi)
set.seed(1)
foo <- parallel::mclapply(seq_len(10), function(l)
lapply(1:10, function(x) mean(rnorm(10000, mean=x))),
mc.cores=4)
Run Code Online (Sandbox Code Playgroud)
... 产生类型的警告消息
1: In selectChildren(ac, 1) : error 'Interrupted system call' in select
2: In selectChildren(ac, 1) : error 'Interrupted system call' in select
3: In selectChildren(ac, 1) : error 'Interrupted system call' in select
Run Code Online (Sandbox Code Playgroud)
如何避免它们?
我用Rmpi和parallel的mclapply一个包,这就是为什么我问。请注意,这已张贴在这里,但我还没有收到答复(还)。如果这很重要,我使用 Ubuntu 12.10、Emacs 24 和 R 2.15.2
本帖参考:
[1] http://www.mathworks.com/matlabcentral/newsreader/view_thread/278243 “使 C++ 对象在 mex 调用之间持久化,并且健壮。”
[2] MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?) “MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?)”
我成功地实现了一个 Matlab/C++ 接口,基于 [1] 上提出的方法。无论如何,我在尝试将系统与 Matlab 并行计算一起使用时遇到了麻烦。
在 MEX 接口中尝试在 matlab 句柄和 C++ 指针之间进行转换时,发生在我身上的是分段错误。
为了更清楚,我将回顾一下 [1] 中提出的结构。系统中有三个文件,采用这种通信方案:
[myInterface.m] <--> [myMexInterface.cpp] <--> [myClass.cpp]
在哪里
该系统的使用分为两个阶段:
好的,代码是:
vector<vector<double>> imageFiltered;
// some processing codes here
parallel_for( blocked_range<unsigned>(0, imageFiltered.size()),
[=](const blocked_range<unsigned>& r) {
for( unsigned i = r.begin(); i != r.end(); ++i ){
for( unsigned j = 0; j != imageFiltered[i].size(); ++j ) {
imageFiltered[i][j] = 0; // error here?expression must be a modifiable lvalue
}
}
});
Run Code Online (Sandbox Code Playgroud)
我写了另一个类似的代码块,它工作得很好。所以,这里有一点帮助。PS:parallel_for 来自 Interl TBB。
我尝试使用 OpenMP 在分区部分和 QuickSort 部分并行化 QuickSort。我的C代码如下:
#include "stdlib.h"
#include "stdio.h"
#include "omp.h"
// parallel partition
int ParPartition(int *a, int p, int r) {
int b[r-p];
int key = *(a+r); // use the last element in the array as the pivot
int lt[r-p]; // mark 1 at the position where its element is smaller than the key, else 0
int gt[r-p]; // mark 1 at the position where its element is bigger than the key, else 0
int cnt_lt = 0; …Run Code Online (Sandbox Code Playgroud) 我想svd()在 R 中的大型稀疏矩阵 (17k x 2m) 上运行,并且我可以访问集群。有没有一种使用多核在 R 中计算 SVD 的直接方法?
RScaLAPACK 包(http://www.inside-r.org/packages/cran/RScaLAPACK)似乎使这成为可能,但它似乎不再受到积极支持(http://cran.r-project.org /web/packages/RScaLAPACK/),我认为这是有原因的。
大家好 Python Pandas 大师。我正在寻找一种与 Python 并行运行一些 SQL 的方法,返回几个 Pandas 数据帧。我有类似于下面的代码,它针对 MS SQL 服务器数据库连续运行 4 个 SQL 查询。其中两个查询的执行时间比 IO(网络)时间长得多以获得结果,所以我认为并行化会使代码运行速度提高约 2 倍。有没有一种简单的方法可以并行执行查询?
理想情况下,我希望能够读取项目子目录中的所有 *.sql 文件,然后触发查询以并行运行并以易于使用的格式(列表?)返回四个数据帧以进一步操作(索引、连接、聚合)。
提前致谢,兰德尔
# imports
import ceODBC
import numpy as np
import pandas as pd
import pandas.io.sql as psql
from ConfigParser import ConfigParser
import os
import glob
# db connection string
cnxn = 'DRIVER={SQL Server Native Client 11.0}; SERVER=<servername>; DATABASE=<dname>; Trusted_Connection=Yes'
# directories (also should be moved to config)
dataDir = os.getcwd() + '\\data\\'
sqlDir = os.getcwd() + '\\sql\\' …Run Code Online (Sandbox Code Playgroud)