问题标签 [concurrent-processing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 获得大量工作
最近我不得不处理一个我认为很常见的问题:给定一个包含大量(百万+)行要处理的数据库表,以及在各种机器/线程中运行的各种处理器,如何安全地允许每个处理器实例在不互相干扰的情况下完成一大块工作(比如 100 个项目)?
我一次获得一大块的原因是出于性能原因 - 我不想为每个项目访问数据库。
scala - Scala 演员作为单线程队列
我想在一个节目中使用演员,在这个节目中,我会对一些演员进行某种限制,就好像他们是队列一样。例如,假设我有一些应用更改事件的外部系统以及一些外部系统数据的缓存。所以我有2个演员:
ChangeApplicationActor
CacheActor
作为 的一部分ChangeApplicationActor
,当我对外部系统中的某个实体应用更改时X
,我想发送一些事件来告诉CacheActor
同步:
但我现在有两个要求:
- 具有
CacheActor
内部状态,理想情况下我希望它Sync
按顺序处理其指令 - 如果我最终在
CacheActor
收件箱中包含两个Sync(x)
相同值的指令x
,那么我想忽略第二个(即Sync
对于任何给定的值,我应该只有一个待处理指令x
)
有没有办法强制一个演员是单线程的?有什么方法可以访问演员的邮箱并删除任何重复的事件?我不能避免实现CacheActor
as, um, not an Actor吗?
php - 防止 php 页面功能的垃圾邮件
背景:好的,我在 ninjawars.net 上运行了一个传统的 BBG。玩家可以对其他玩家进行“攻击”,该“攻击”是通过表单发布初始化的。本质上,我们可以简化情况,假设有一个页面,我们称之为attack.php,有一个巨大的“ATTACK”表单提交到另一个php页面,我们称之为accept_attack.php,第二个页面执行攻击功能,可以说杀死其他玩家 1、2 或 3。服务器运行 PHP5、Postgresql、Apache
问题:
- 如果我点击那个大的“ATTACK”按钮,它会把我带到accept_attack.php,然后我可以点击刷新三次,每次重新提交,连续攻击三次。
- 如果我打开第一页的三个标签,并在每一页上点击攻击,我最终会得到三个瞬时攻击,同时杀死玩家 1、2 和 3,我可以不断刷新重复。
- 尽管我尝试将“最近的攻击”计时器保存到数据库中,但玩家似乎能够解决它,也许只需以足够同步的方式刷新三个复制的选项卡,以便他们都可以检索到相同的计时器(例如上午 10:00:00:0000),然后继续进行结果处理。
需要的解决方案:
那么如何防止对某个脚本的相同处理一式三份地同时执行呢?
首选 PHP、社会工程和/或 javascript/jQuery 解决方案(可能按此顺序)。
编辑:根据答案,这是我所做的(可能是在压力测试之前)解决它:会话答案似乎最简单/最容易实现,所以我使用了那个数据存储。我对其进行了测试,它似乎可以工作,但可能有一些我不知道的方法。
如果有改进的方法或者可以利用的方法(除了对我来说很明显的那个,回声的东西不是一个很好的逻辑分离,我很想知道。沿着这些思路,社区维基编辑.
python - 同时下载多个页面?
我想用 Python 编写一个脚本,它可以从数据库中获取 url,并同时下载网页以加快速度,而不是等待每个页面一个接一个地下载。
根据这个线程,Python 不允许这样做,因为称为Global Interpreter Lock的东西可以防止多次启动同一个脚本。
在花时间学习 Twisted 框架之前,我想确保没有更简单的方法来完成我上面需要做的事情。
谢谢你的任何提示。
c# - C#中使用BackgroundWorker的并发线程
我的 C# 应用程序是这样的,即使用后台工作程序来等待对某些传输数据的确认。这是一些伪代码,演示了我正在尝试做的事情:
发生的情况是 ACK BackgroundWorker 超时,并且从未收到确认。我相当肯定它是由远程设备传输的,因为该设备根本没有改变,而 C# 应用程序正在传输。我已经从这里更改了 ack 线程(当它工作时)......
……到这……
与前者相比,后者产生非常准确的等待时间。但是,我想知道删除睡眠功能是否会干扰接收串行数据的能力。C#是否一次只允许一个线程运行,也就是说,我是否必须在某个时间让线程休眠以允许其他线程运行?
您可能有的任何想法或建议将不胜感激。我正在使用 Microsoft Visual C# 2008 Express Edition。谢谢。
c# - C# 中 BackgroundWorker2_RunWorkerCompleted 的无效跨线程操作
我收到一个没有意义的错误。
Cross-thread operation not valid: Control 'buttonOpenFile' accessed from a thread other than the thread it was created on.
在我的应用程序中,UI 线程触发backgroundWorker1
,几乎完成时触发backgroundWorker2
并等待它完成。 在完成之前 backgroundWorker1
等待完成。变量用于标记每个工人何时完成。在调用重置表单控件的函数中。正是在这个函数中引发了异常。我认为在函数中修改表单控件是安全的。两个后台工作人员都是从 UI 线程实例化的。这是我正在做的一个非常概括的版本:backgroundWorker2
AutoResetEvent
backgroundWorker2_RunWorkerComplete
ResetFormControls()
RunWorkerCompleted
您可能有的任何想法或建议将不胜感激。我正在使用 Microsoft Visual C# 2008 Express Edition。谢谢。
process - 这个多任务相关的报价是否正确?
在多核系统上运行时,多任务操作系统可以真正同时执行多个任务
我在国民仪器的网站上看到了这句话,我认为“并发”应该是“并行”。我对吗?
c# - 在并发数据处理期间如何避免内存不足?
我对数据并发处理有疑问。我的电脑很快就用完了 RAM。关于如何修复我的并发实现的任何建议?
普通类:
代码的单核实现如下:
多核实现:
我遇到的问题是几乎每个combinations
字典都以其中的930k
记录结尾,这平均会消耗400 [MB]
RAM内存。
现在,在单核实现中只有一个这样的字典。所有检查都是针对一本字典执行的。但这是一种缓慢的方法,我想使用多核优化。
在多核实现中,ConcurrentBag
创建了一个包含所有combinations
字典的实例。多线程作业完成后 - 所有字典都聚合为一个。这种方法适用于少量并发迭代。例如,对于 4 次迭代,我的RAM使用量为~ 1.5 [GB]
. 当我设置并行迭代的全部数量时,问题就出现了,即 200!再多的 PCRAM
也不足以容纳所有字典,每本字典都有数百万条记录!
我一直在考虑使用ConcurrentDictioanary
,直到我发现“TryAdd”方法在我的情况下不能保证添加数据的完整性,因为我还需要对运行总计进行更新。
唯一真正的多线程选项是,而不是将全部添加combinations
到字典中 - 是将它们保存到某个数据库中。数据聚合将是一个select
带有group by
子句的 1 个 SQL 语句的问题......但我不喜欢为此创建一个临时表并运行数据库实例的想法......
是否有解决如何同时处理数据而不用完 RAM 的方法?
编辑:也许真正的问题应该是 - 如何RunningTotals
在使用时更新线程安全ConcurrentDictionary
?我刚刚遇到了这个线程,遇到了类似的问题ConcurrentDictionary
,但我的情况似乎更复杂,因为我有一个需要更新的数组。我还在调查这件事。
EDIT2:这是一个有效的解决方案ConcurrentDictionary
。我需要做的就是为字典键添加一个锁。
单线程代码执行时间为1m 48s
,而此解决方案执行时间1m 7s
为 4 次迭代(性能提升 37%)。我仍然想知道 SQL 方法是否会更快,有数百万条记录?我可能会在明天对其进行测试并更新。
编辑 3:对于那些想知道ConcurrentDictionary
更新值有什么问题的人 - 在有和没有锁定的情况下运行此代码。
编辑 4:经过反复试验,我无法优化 SQL 方法。结果证明这是最糟糕的主意:) 我使用了SQL Lite
数据库。内存中和文件中。带有事务和可重用的 SQL 命令参数。由于需要插入大量记录 - 性能不足。数据聚合是最简单的部分,但仅仅插入 400 万行就需要大量时间,我什至无法想象如何有效地处理这 2.4 亿条数据.. 到目前为止(也很奇怪) ,ConcurrentBag
方法似乎是我电脑上最快的。其次是一个ConcurrentDictionary
方法。ConcurrentBag
不过,在内存上有点重。感谢@Alisson的工作——现在可以将它用于更大的迭代集!
concurrent-processing - 如何最好地组织一组具有已知持续时间的进程的并发处理?
我们有一个任务处理系统,它使用 4 个 CPU 处理许多任务,在任何给定的批次中介于 12 到 16 个之间。
每个任务在单个 CPU 上花费的时间是已知的。
目前,选择要运行的任务的顺序是任意的。这些任务不是相互依赖的。
我们最终让一个 CPU 独立运行以完成最后一项任务。
只有在完成最后一项任务后,整个批次才会移交给下一步。
我希望找到一种方法来优化任务的顺序,以在最后只有一个 CPU 运行时最小化这个时间。
我希望这是一个常见问题,问题是我真的不知道如何正确制定它以在 Google 中找到有用的结果。
所以我要求stackoverflow社区像往常一样出色。
此致,
科尔姆
举个例子
在上面的例子中,如果我采用最大优先的方法(即上面列出的倒序),那么所有 13 个任务都在 337 秒内完成。
但是我看到我们的系统按照 1,4,9,2,5,11,12,3,13,10,8,6,7 的顺序执行上述任务(其中 1 是上面列表中的第一个等.) 总时间为 322 秒。
按照第一个回复者的链接(非常感谢),我发现我的问题被称为https://en.wikipedia.org/wiki/Multiprocessor_scheduling并且显然有算法,所以我会继续寻找。
顺便说一句,在圣诞节和年底之间工作的人有很多话要说,那时事情很平静,你可以真正思考一下事情。
c# - 如何使用 async 和 await 发出大量并发 Web 请求?
我在How to: Make Multiple Web Requests in Parallel by Using async and await (C#) 中阅读了 Microsoft 的 操作指南 ,发现:
我理解这段代码,但我的问题是:如何修改它以将其缩放到喜欢的程度,比如说一百或一千?