问题标签 [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.
python - 在 Python 中设计异步 API
(注意:这个问题严格来说是关于 API 的设计,而不是关于如何实现它;即我只关心我的 API 的客户端在这里看到了什么,而不是我必须做什么才能使其工作。)
简单来说:我想知道 Python 中明确的未来(又名承诺,又名延迟,又名任务 - 名称因框架而异)的已建立模式 - 如果有的话。以下是更详细的描述。
考虑一个简单的 Python API,如下所示:
这是一个同步版本 - 如果线路尚不可用,它将阻塞。现在假设我想提供一个相应的异步(非阻塞)版本,它允许注册一个回调,以便在操作完成后调用。例如,一个简单的版本可能如下所示:
现在,在其他语言和框架中,这些 API 通常存在现有的强制或至少是完善的模式。例如,在版本 4 之前的 .NET 中,通常会提供一对BeginReadLine
/EndReadLine
方法,并使用 stockIAsyncResult
接口来注册回调并传递结果值。在 .NET 4+ 中,使用System.Threading.Tasks
, 以启用所有任务组合运算符(WhenAll
等),并与 C# 5.0async
功能挂钩。
再举一个例子,在 JavaScript 中,标准库中没有什么可以涵盖这一点,但 jQuery 已经普及了现在单独指定的“延迟承诺”接口。因此,如果我要在 JS 中编写 async readLine
,我会命名它,并在返回值上readLineAsync
实现方法。then
Python 领域的既定模式(如果有的话)是什么?查看标准库,我看到几个提供异步 API 的模块,但它们之间没有一致的模式,也没有像“任务”或“承诺”的标准化协议。也许有一些模式可以从流行的第三方库中派生出来?
我还在 Twisted 中看到了(在这种情况下经常提到的)Deferred类,但它似乎针对通用的 Promise API 进行了过度设计,而是适应了该库的特定需求。它看起来不像是我可以轻松克隆一个接口(而不依赖于它们)的东西,这样如果客户在他的应用程序中同时使用这两个库,我们的 Promise 就可以很好地互操作。是否有任何其他流行的库或框架具有为此明确设计的 API,我可以在不直接依赖的情况下复制(并与之互操作)?
java - 未来实例列表
我想用性能更高的东西替换未来实例列表。目前我正在遍历一棵树并提交一个 Callable 以确定树中每个节点的后代或自身节点的数量。我将 Future 实例保存在 List 中,然后在需要时从 List 中获取适当的节点数:
可悲的是,使用 List 的轴必须等到所有 Future 实例都已提交。此外,它不会超出主内存限制:-/
也许 Google Guava 和 ListenableFuture 是正确的选择。
编辑:现在我想我实际上会使用 PropertyChangeListener 构建一些东西,每当触发 Future 时,Futures 就会添加到列表中。然后我将 CountDownLatch 初始化为 1,并在每次将新的 Future 添加到列表时调用 countDown()。就像是:
然后在 doHasNext() 中:
和听众:
我不确定它是否有效,为时已晚,我不相信我会使用 CountDownLatch 的方式(尚未测试上述代码)。
编辑:以防万一有人感兴趣。我现在简单地将 BlockingQueue 与 PropertyChangeListener 的实现结合使用,而不是 CountDownLatch 和 List,这似乎是一个很好的“干净”解决方案。
问候,
约翰内斯
java - Akka / futures - Akka 是否决定使用当前线程或调度程序是否“值得”?
我目前正在考虑使用 Akka(Java API/库)来完成创建多个Future
s 并将它们放入BlockingQueue
. 现在可能是由 Callables 处理的某些任务在调用线程中运行得更快/更快,而不是创建新线程或等待新线程可用。我认为 Akka 正是这样做的,例如,如果我正在运行:
它可能在调用 future(Callable) 的当前线程中执行,还是我错了?也许我错了,因为我不明白调度程序将如何决定是否创建新线程。
现在我只是使用一个使用其他线程的 ExecutorService,但是由于某些任务真的非常快,它们也可以由当前线程处理。但我正在使用 aBlockingQueue<Future<Float>>
这就是为什么我有时不能使用Future
s 有时不能。
最好的问候,
约翰内斯
c++ - 如何创建带有参数的 packaged_task?
按照这个关于期货、承诺和打包任务的优秀教程,我到了想要准备自己的任务的地步
据我可以破译 gcc-4.7.0 错误消息,它期望的参数不同吗?但是怎么做?我尝试缩短错误消息:
我的变体是如何提供错误的参数ackermann
吗?还是模板参数错误?我不给3,11
创建线程的参数吧?
更新其他不成功的变体:
嗯……是我,还是 beta-gcc?
java - future.get 在取消时在 Callable 中最终执行之前返回
我有一个间歇性失败的测试,当未来被取消时,在可调用的 finally 块执行之前,future.get 调用正在返回。这是基本的工作流程:
future.cancel(true);
我看到InterrupedException
扔在Callable
主线程CancellationException
从future.get
调用中捕获
现在Callable
来电了finally
。
测试在我的笔记本上总是成功的,而在我们的构建服务器上大部分时间都失败了。我的笔记本和构建服务器都在运行 OpenJDK 1.7。有任何想法吗?
scala - 使用 akka 期货和演员来并行化列表
我想向演员发送消息列表,在未来立即收到回复,然后等待所有未来完成,然后再返回调用方法。通过阅读 akka 文档,我相信 Future.sequence 是要走的路,但我无法让以下代码正常工作。我从编译器得到这个错误:
我确定我遗漏了一些明显的东西,但是根据示例和 API 文档,下面的代码似乎是“正确的”。
向演员发送一系列消息,接收未来并在所有未来完成后返回的正确方法是什么(可选地将每个未来的结果存储在列表中并返回它)。
scala - 如何在 Scala 的一组 Actor 中检索第一个完成的 Actor?
我有适量的长时间运行的 Actor,我希望编写一个同步函数来返回其中第一个完成的。我可以通过对期货的旋转等待来做到这一点(例如:
),但这似乎非常“非演员”
该类scala.actors.Futures
有两种方法 awaitAll()
,awaitEither()
看起来非常接近;如果有一个awaitAny()
我会跳上它。我是否缺少一种简单的方法来做到这一点,或者是否有适用的通用模式?
nhibernate - ToRowCountQuery 似乎忽略了分组
我正在尝试从常规查询创建行计数查询,但生成的 SQL 似乎缺少 GROUP BY 导致错误计数。有谁知道我做错了什么。
首先是查询:
生成的 SQL:
那么行计数查询中的 GROUP BY 在哪里?
更新 事实证明,ToRowCountQuery 从原始查询中去除了选择和分组。那么我该怎么做这样的事情:
Firo 的答案似乎是朝着正确方向迈出的一步,但我不能使用 CountDistinct,因为我需要对所有字段进行计数,包括选择列表中显示的最小/最大字段。除此之外, CountDistinct 不采用 IProjection 作为参数:
更新 2
根据 Firo 回答中的链接,我想出了这个替代方案。我修改query
为一个分离的 QueryOver 对象。接下来,我尝试了这个:
但是,这会导致ArgumentOutOfRangeException
:
scala - 使用 Akka 分叉和加入
问题陈述:我有一个需要以并行方式处理的证券组合。在 Java 中,我使用线程池来处理每个安全性,并使用锁存器进行倒计时。完成后,我会进行一些合并等。
所以我向我的 SecurityProcessor(它是一个演员)发送消息,并等待所有期货完成。最后,我使用 MergeHelper 进行后处理。SecurityProcessor 接受一个安全,做一些 i/o 和处理并回复一个安全
这种设计是否正确,是否有更好/更酷的方法来使用 akka 实现这个常见问题?
nhibernate - Linq to NHibernate + 转换 + 期货
我知道您可以通过调用 .ToFuture<>() 扩展方法来执行 Linq to NHibernate 查询作为未来。但是,我没有加载映射实体,而是直接将数据加载到 DTO 中。所以你会得到类似的东西:
这不像我想要的那样工作(我敢说是预期的)。我现在收到一个错误:The value "System.Object[]" is not of type "Entity" and cannot be used in this generic collection.
如果我删除.ToFuture()
它确实有效,但查询没有批处理。
我知道您可以使用 QueryOver API 来做到这一点,我只是更喜欢 Linq to NH,因为它的代码更加简洁。