问题标签 [concurrency]
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.
java - ExecutorService 中的活动线程
任何想法如何确定当前运行的活动线程数ExecutorService
?
perl - 我可以让 Windows 中的 Perl ithreads 并发运行吗?
我有一个尝试使用 Perl 线程(使用线程)设置的 Perl 脚本。当我运行简单的测试时,一切正常,但是当我执行我的实际脚本(其中有运行多个 SQL Plus 会话的线程)时,每个 SQL Plus 会话按顺序运行(即线程 1 的 sqlplus 运行步骤 1-5,然后线程 2 的 sqlplus运行步骤 6-11 等)。
我以为我明白线程会进行并发处理,但有些不对劲。有什么想法,还是我应该做一些其他的 Perl 魔法?
concurrency - 并发 Prime 生成器
我正在通过 projecteuler.net 上的问题来学习如何在 Erlang 中编程,而我最难的是创建一个可以在不到一分钟的时间内创建所有低于 200 万的素数的素数生成器。使用顺序样式,我已经编写了三种类型的生成器,包括 Eratosthenes 的筛子,它们都没有表现得足够好。
我认为并发 Sieve 会很好用,但我收到 bad_arity 消息,我不知道为什么。关于我为什么遇到问题或如何正确编码的任何建议?
这是我的代码,注释掉的部分是我试图使事情并发的地方:
java - 分布式并发控制
我已经为此工作了几天,我找到了几种解决方案,但没有一个非常简单或轻量级。问题基本上是这样的:我们有一个由 10 台机器组成的集群,每台机器都在多线程 ESB 平台上运行相同的软件。我可以相当容易地处理同一台机器上的线程之间的并发问题,但是不同机器上相同数据的并发呢?
本质上,该软件接收请求以通过 Web 服务将客户数据从一个企业提供给另一个企业。但是,客户可能存在也可能不存在于其他系统上。如果没有,我们通过 Web 服务方法创建它。所以它需要一种测试和设置,但我需要某种信号量来阻止其他机器引起竞争条件。我之前遇到过为一个本地客户创建两次远程客户的情况,这并不是很理想。
我在概念上玩弄过的解决方案是:
使用我们的容错共享文件系统来创建“锁定”文件,这些文件将由每台机器根据客户进行检查
在我们的数据库中使用一个特殊的表,并锁定整个表以便对锁定记录进行“测试和设置”。
使用 Terracotta,一种有助于扩展的开源服务器软件,但使用的是中心辐射模型。
使用 EHCache 同步复制我的内存“锁”。
我无法想象我是唯一遇到过这种问题的人。你是怎么解决的?您是自己做的还是有最喜欢的第 3 方产品?
java - 如何为 HTTP servlet 容器选择最大线程数?
我正在开发一个安静的 Web 服务,它在 Jetty 中作为 servlet(使用阻塞 IO)运行。找出最大线程的最佳设置似乎很难。
是否有研究公式可以从其余设置的一些易于测量的特征中确定最大线程数?
java - 从多个线程(不修改)从 java.util.HashMap 获取值是否安全?
有一种情况,地图会被构造出来,一旦初始化,就再也不会被修改了。但是,它将被多个线程访问(仅通过 get(key))。以这种方式使用 a 是否安全java.util.HashMap
?
(目前,我很高兴使用 a java.util.concurrent.ConcurrentHashMap
,并且没有衡量提高性能的需要,但我只是好奇一个简单HashMap
是否就足够了。因此,这个问题不是“我应该使用哪个?”也不是性能问题。相反,问题是“它安全吗?”)
c# - 在 C# 中锁定
我仍然有点不清楚什么时候在一些代码周围加锁。我的一般经验法则是在读取或写入静态变量时将操作包装在锁中。但是当一个静态变量只被读取时(例如,它是在类型初始化期间设置的只读),访问它不需要包含在锁定语句中,对吗?我最近看到一些类似于以下示例的代码,这让我觉得我的多线程知识可能存在一些差距:
这对我来说没有意义——为什么会出现读取寄存器的并发问题?
此外,这个例子提出了另一个问题。其中一个比另一个更好吗?(例如,两个持有锁的时间更短?)我想我可以拆卸 MSIL ......
对比
.net - 在 .NET 中的并发线程之间传递数据的最佳方式是什么?
我有两个线程,一个需要轮询一堆单独的静态资源以查找更新。另一个需要获取数据并将其存储在数据库中。线程 1 如何告诉线程 2 有东西要处理?
java - 等到任何未来已经完成了
我运行的异步任务很少,我需要等到其中至少一个完成(将来我可能需要等待 util M out of N 个任务完成)。目前它们被呈现为未来,所以我需要类似的东西
有这样的吗?或任何类似的东西,对 Future 来说不是必需的。目前我循环收集期货,检查一个是否完成,然后休眠一段时间并再次检查。这看起来不是最好的解决方案,因为如果我长时间睡眠,则会增加不必要的延迟,如果我睡眠时间很短,则会影响性能。
我可以尝试使用
并在任务完成时减少倒计时并执行
,但我发现只有在我控制未来创建时才有可能。这是可能的,但需要重新设计系统,因为当前创建任务的逻辑(向 ExecutorService 发送 Callable)与等待哪个 Future 的决策是分开的。我也可以覆盖
并创建 RunnableFuture 的自定义实现,能够附加侦听器以在任务完成时收到通知,然后将此类侦听器附加到所需的任务并使用 CountDownLatch,但这意味着我必须为我使用的每个 ExecutorService 覆盖 newTaskFor - 并且可能会有实现它不扩展 AbstractExecutorService。我也可以尝试包装给定的 ExecutorService 用于相同的目的,但是我必须装饰所有产生 Futures 的方法。
所有这些解决方案都可能有效,但看起来非常不自然。看起来我错过了一些简单的东西,比如
在 C# 中。这类问题有没有众所周知的解决方案?
更新:
最初我根本无法访问 Future 创建,因此没有优雅的解决方案。重新设计系统后,我可以访问 Future 创建并能够将 countDownLatch.countdown() 添加到执行过程中,然后我可以 countDownLatch.await() 并且一切正常。感谢其他答案,我不知道 ExecutorCompletionService ,它确实可以在类似的任务中有所帮助,但在这种特殊情况下,它无法使用,因为某些 Futures 是在没有任何执行程序的情况下创建的 - 实际任务通过网络发送到另一台服务器,远程完成并收到完成通知。
programming-languages - 多核和并发 - 语言、库和开发技术
CPU 架构格局发生了变化,多核是一种趋势,它将改变我们开发软件的方式。我用 C、C++ 和 Java 做过多线程开发,我用各种 IPC 机制做过多进程开发。对于开发人员来说,使用线程的传统方法似乎并不容易使用支持高度并发的硬件。
您知道哪些语言、库和开发技术有助于缓解创建并发应用程序的传统挑战?我显然在考虑死锁和竞争条件等问题。设计技术、库、工具等也很有趣,它们有助于实际利用并确保利用可用资源——仅仅编写一个安全、健壮的线程应用程序并不能确保它使用了所有可用的内核。
到目前为止我看到的是:
- Erlang:基于进程,消息传递 IPC,'actor 的并发模型
- Dramatis:Ruby 和 Python 的演员模型库
- Scala:用于 JVM 的函数式编程语言,增加了一些并发支持
- Clojure:用于 JVM 的函数式编程语言,带有演员库
- Termite : Erlang 进程方法和消息传递给 Scheme 的一个端口
你还知道什么,什么对你有用,你认为什么有趣?