问题标签 [future]

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.

0 投票
1 回答
907 浏览

scala - 当 Scala“Future”被垃圾收集时会发生什么?

假设我有一个Stream计算起来相当昂贵的东西。我可以通过编写类似的东西轻松创建一个“提前计算”的线程

如果我然后丢弃对 this 的引用,Future该线程会被垃圾收集器杀死吗?

0 投票
3 回答
6891 浏览

java - Future.cancel(false) 的用例?

在什么情况下希望将false参数mayInterruptIfRunning传递给Future.cancel()?

如果我理解正确,如果您通过false并且任务被取消但线程没有被中断,则结果(或ExecutionException)将永远无法访问,因为任务仍被标记为已取消(即isCancelled()返回trueget()抛出CancellationException。)

其他可能的情况是:

  • RunnableorCallable实现不检查中断,即使你中断它也会运行完成(这里中断没有区别)
  • 在您调用之前已经完成的任务cancel()(再次中断没有区别)
  • 该任务需要在退出之前执行一些清理(一个编写良好的实现将try ... finally用于此。)
  • 任务不能立即终止,必须继续执行受中断影响的操作,例如阻塞 I/O(在这种情况下,您可能根本不应该调用cancel

那么什么时候/为什么你会取消一个任务而不打断它呢?

0 投票
3 回答
2020 浏览

java - 公开 @Asynchronous 函数的当前进度以在 View 中使用

在我的 JEE6-App(在 Glassfish 3.0.1 上运行)中,我有一个必须发送大量邮件的 EmailEJB。邮件是异步发送的,因此它使用新的 EJB3.1 @Asynchronous 进行注释,让它在单独的线程中运行。现在我希望用户了解该方法的当前状态:已经发送了多少封邮件?

异步发送邮件工作正常,但我不知道如何让进度可以从外部访问。似乎我这样做的方法是非常错误的,但不知何故它必须是可能的(也许是另一种方法)。这就是我的 EmailEJB 目前的样子(它是一种伪代码,但解释了我想要什么):

如何在异步函数中返回当前进度,而不用返回取消它?如何向用户显示函数内循环的进度?我需要另一种异步方法吗?有什么提示吗?

0 投票
2 回答
777 浏览

scala - 将多个期货与多个远程参与者一起使用时程序挂起

我在一台主机上启动了两个远程参与者,它们只是回显发送给他们的任何内容。然后,我创建另一个参与者,它向两个参与者发送一些消息(使用 !! ),并保留一个未来对象列表,其中包含来自这些参与者的回复。然后我遍历这个 List 来获取每个 Future 的结果。问题是大多数时候有些期货永远不会返回,即使演员声称它已经发送了回复。问题是随机发生的,有时它会通过整个列表,但大多数时候它会卡在某个点并无限期挂起。

这是一些在我的机器上产生问题的代码:

水槽.scala:

来源.scala:

我究竟做错了什么?

0 投票
1 回答
775 浏览

scala - Scala 参与者与非参与者的交互(或将参与者的消息同步到 servlet)

我有以下斯卡拉代码:

在上面的代码中,我必须使用thread.sleep确保有足够的时间进行result更新,否则0返回。在不使用的情况下,有什么更优雅的方式来做到这一点thread.sleep?我想我必须使用期货,但我无法理解这个概念。我需要确保每个 HTTP 请求都获得一个唯一的随机数(当然,随机数只是为了说明问题)。一些提示或参考将不胜感激。

0 投票
3 回答
2690 浏览

java - 等待取消的未来真正完成

我有一个SwingWorker调用一些不检查线程中断的代码。在调用 之后worker.cancel(true),该worker.get()方法将立即抛出CancellationException(正如它应该的那样)。然而,由于后台任务的代码从不检查它的线程是否被中断,它很高兴地继续执行。

是否有等待后台任务实际完成的标准方法?我正在寻找显示“取消...”消息或类似的内容并阻止,直到任务终止。(我敢肯定,如有必要,我总是可以在工人阶级中使用标志来完成此任务,只是寻找任何其他解决方案。)

0 投票
3 回答
3852 浏览

haskell - 哈斯克尔的期货

Haskell 是否具有相当于 Alice 将变量绑定到未来的能力?

其中 foo 是一些函数。

我知道 Haskell 支持通道和线程;我希望语法和 Alice 一样自然,可以将值绑定到未来并产生一个线程来计算它,而无需处理细节。

0 投票
2 回答
1945 浏览

multithreading - 为什么我的 scala 期货效率不高?

我在 32 位四核 Core2 系统上运行这个 scala 代码:

(是的,我确实知道有很多更有效的方法可以对一系列整数求和;这只是让 CPU 有事可做)。

根据我将 JOBS 设置为的内容,代码将在以下时间运行:

令我惊讶的是,这并没有真正超出“正在发挥作用”的 2 个期货。我做了很多多线程 C++ 代码,毫无疑问,如果我用英特尔的 TBB 编写这种东西,或者boost::threads(当然会更冗长),我会很好地扩展到 4 个内核,并看到 > 390% 的 CPU 利用率)。

那么:发生了什么事,我怎样才能将规模扩大到我希望看到的 4 个核心?这是否受到 scala 或 JVM 中的某些东西的限制?我突然想到,我实际上并不知道 scala 的期货在“哪里”运行……是每个未来产生的线程,还是“期货”提供专用于运行它们的线程池?

[我在带有 sun-java6 (6-20-0lennny1) 的 Lenny 系统上使用来自 Debian/Squeeze 的 scala 2.7.7 软件包。]

更新:

正如雷克斯的回答中所建议的,我重新编码以避免创建对象。

这快得多了,我不得不显着增加迭代次数才能运行任何时间!结果是:

这更像是我希望看到的(尽管 3 个工作案例有点奇怪,其中一个任务始终比其他两个任务早几秒钟完成)。

更进一步,在四核超线程 i7 上,后一个版本JOBS=8实现了 x4.4 的加速比 JOBS=1,CPU 使用率为 571%。

0 投票
1 回答
174 浏览

java - 使用 ExecutorService 产生的结果。哪一堂课?

我希望我能写下类/接口名称,但我没有……

在查看 JDK javadocs 时,我看到了对类/接口的引用,其目的是收集和使用ExecutorService(完成Futures<T>的 s)产生的结果,可能在系统的其他地方。当时我在心里记下了它,因为它非常适合我需要的东西,但我似乎无法从舌尖说出课程的名称。

有人知道我指的是什么吗?

0 投票
1 回答
713 浏览

scala - 为期货做出反应

我正在尝试使用分而治之(又名 fork/join)方法来解决数字运算问题。这是代码:

它运行(具有很好的加速),但未来的 apply 方法似乎阻塞了一个线程并且线程池极大地增加了。当创建太多线程时,计算就会卡住。

有没有一种释放线程的期货反应方法?或任何其他方式来实现这种行为?

编辑:我正在使用 scala 2.8.0.final