我们正在为Python + Celery开发一个用于我们任务队列的分布式应用程序.
我们的应用程序要求我们通过IMAP(例如:gmail)从远程ISP下载电子邮件,我们希望能够并行完成此任务.对于给定的电子邮件帐户,您被授予限制为多个模拟连接,因此我们需要一种方法来原子地跟踪所有正在下载的帐户的活动连接.
我已经使用Redis找到了Celery的多个原子锁示例,但没有一个可以跟踪这样的有限资源池,并且所有实现我们自己的尝试都导致难以调试竞争条件,导致我们的锁定间歇性地永远不会被释放.
给定一个数组[x1,x2,x3,...,xk],其中xi是方框i中的项目数,如何重新分配项目,以便任何方框都不包含多于N个项目.N接近sum(xi)/ k - 也就是说,N接近具有相同项目数的每个框.不应使用中间框来携带物品 - 如果x1有盈余且x2和x3有缺陷,x1应该将一些物品发送到x2和x3,但不要将所有物品发送到x2然后让x2解决盈余.
实际问题是:每个计算节点都有一组样本,并且在重新采样步骤之后,一些计算机节点可能有盈余而其他计算机节点有缺陷,所以我想重新分配样本,同时最小化通信.
我想这种问题有一个名字.
我正在编写一个执行一些长计算的程序,我可以根据需要分成任意数量的任务.为了便于讨论,让我们假设我正在编写一种算法,通过尝试将它除以2和p-1之间的所有数来找出数p是否为素数.显然,这个任务可以分解为许多线程.
我实际上写了一个样本应用程序就是这样做的.作为一个参数,我给出了我想要检查的数字,以及要使用的线程数(每个线程都有一个相同大小的数字范围,试图将p除以 - 它们一起覆盖整个范围).
我的机器有8个核心.我开始使用大量的程序运行程序,我知道它是素数(2971215073),并且有1,2,3个线程等,直到达到8个线程 - 每次程序运行速度比前一个快,这是我的预期.但是,当我尝试大于8的数字时,计算时间实际上变得越来越小(即使是一点点)!
在我的线程中没有I/O或类似的东西,只是纯粹的cpu计算.当我通过8个线程时,我预计运行时间会变得更糟,因为会有更多的上下文切换,并行运行线程的数量保持在8个.很难说峰值在哪里因为差异很小而且变化很大从一次运行到另一次运行,但很明显,即50个线程以某种方式运行速度超过8(约300毫秒)......
我的猜测是因为我有这么多线程,所以我得到更多的运行时间,因为我在系统的线程池中有更大的部分,所以我的线程被选中更多.但是,我创建的线程越多,程序运行得越快就越有意义(否则为什么不是每个人都创建1000个线程?).
任何人都可以提供一个解释,也许是最佳实践,关于创建相对于机器上的核心数量的线程数量?
谢谢.
我感兴趣的人的代码(在Windows上编译,VS2012):
#include <Windows.h>
#include <conio.h>
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
typedef struct
{
unsigned int primeCandidate;
unsigned int rangeStart;
unsigned int rangeEnd;
} param_t;
DWORD WINAPI isDivisible(LPVOID p)
{
param_t* param = reinterpret_cast<param_t*>(p);
for (unsigned int d = param->rangeStart; d < param->rangeEnd; ++d)
{
if (param->primeCandidate % d == 0)
{
cout << param->primeCandidate << " is divisible by " << d << endl;
return …Run Code Online (Sandbox Code Playgroud) c++ parallel-processing multithreading distributed-computing threadpool
我试图理解"农场"在计算中的意义,因此,如果一个农场可以作为一个集群示例,那么必须有一个农场独立于集群的东西.
它与网格有什么不同?
这些概念是否具有一般意义,例如,谈论Web服务器只是一种常见的情景,或者它们是否完全不同于上下文?如果是这样,有什么不同的含义(或最常见的含义)?
另外,我应该在其他地方问这个吗?(如果是的话,我表示道歉).
parallel-processing grid distributed-computing cluster-computing web-farm
我是Hadoop生态系统的新手.
我最近在单节点集群上尝试了Hadoop(2.7.1)而没有任何问题,并决定转向具有1个namenode和2个datanode的多节点集群.
但是我面临一个奇怪的问题.无论我尝试运行什么工作,都会遇到以下消息:
在网络界面上:
YarnApplicationState: ACCEPTED: waiting for AM container to be allocated, launched and register
Run Code Online (Sandbox Code Playgroud)
在cli中:
16/01/05 17:52:53 INFO mapreduce.Job: Running job: job_1451083949804_0001
Run Code Online (Sandbox Code Playgroud)
他们甚至没有开始,在这一点上,我不确定我需要做出哪些改变才能使其发挥作用.
这是我试图解决的问题:
我真的很感激任何帮助(即使是一分钟的提示)正确的方向.
我已按照这些说明(配置):
哪个是实际使用的差异?我找到了这个IBM链接和这个问题MPI - MPI_Init和MPI_Init_thread的一个函数.如果重要的话,我只对C感兴趣.
两个功能的描述相同:
MPI_Init_thread初始化MPI执行环境
正如你在他们的refs中看到的那样:MPI_Init()和MPI_Init_thread(),但参数不同.
c parallel-processing multithreading distributed-computing mpi
我正在寻找分布式计时器服务。多个远程客户端服务应该能够在指定的时间间隔后注册回调(通过 REST api)。间隔的长度可以是 1 分钟。我可以忍受大约 1 分钟的误差。此类回调的数量目前可以达到 100,000,但我以后需要扩大规模。我一直在寻找类似的调度程序,Quartz但我不确定它们是否适合这个问题。使用Quartz,我可能不得不将回调请求保存在数据库中,并每分钟轮询 100,000 行的过期请求。我不确定这会扩大规模。是否有任何开箱即用的解决方案?否则,我该如何建造一个?
我在网上找到了两个定义:
顺序一致性——任何执行的结果都是一样的,就好像所有处理器的操作都是按某种顺序执行的,每个处理器的操作都按照其程序指定的顺序出现在这个序列中。
最终一致性——如果没有对给定数据项进行新的更新,最终对该项目的所有访问都将返回最后更新的值。
这些定义对我来说很清楚。但是,当最终一致性不是连续的时,我不明白。一个例子:mem 中的初始值是 0。横轴是时间。
P1: write 1 (x)
P2: read 0 read 0 read 0 read 1 read 1 read 1
Run Code Online (Sandbox Code Playgroud)
因此,有一些顺序顺序,如果我们在 (x) 槽中放置“写入 1”,这就是顺序一致性的定义。我哪里错了?
consistency distributed-computing distributed-system eventual-consistency
我一直无法找到适合Vector Clocks和Version Vectors 的用例以及它们可能有何不同的示例。我知道它们在很大程度上以相同的方式工作,向量时钟使用receive和send函数,版本向量使用sync函数,但我不明白这两个选项之间的区别。它只是表达同一事物的两种不同方式,还是它们之间的用例存在真正的差异?
我只能找到一个有点相关的问题:“我什么时候使用像 Paxos 这样的共识算法与使用像 Vector Clock 这样的算法?”
尽管链接的答案陈述了以下内容并引用了一篇短文,但我仍然不清楚这些差异。
您可能希望将版本向量用于无领导分布式存储。您可能会为此使用矢量时钟(尽管它更适合;本文还建议您将其用于一致的快照,用于在一般分布式系统中实现因果排序等)。
replication synchronization distributed-computing distributed-system data-structures
algorithm ×1
c ×1
c++ ×1
cassandra ×1
celery ×1
consistency ×1
distributed ×1
grid ×1
hadoop ×1
hadoop-yarn ×1
linux ×1
mapreduce ×1
mpi ×1
nosql ×1
python ×1
replication ×1
sampling ×1
semaphore ×1
threadpool ×1
web-farm ×1