问题标签 [async-workflow]

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 投票
4 回答
1212 浏览

multithreading - 在嵌套循环中并行化代码

你总是听说函数式代码本质上比非函数式代码更容易并行化,所以我决定编写一个函数来执行以下操作:

给定一个字符串输入,合计每个字符串的唯一字符数。因此,给定输入[ "aaaaa"; "bbb"; "ccccccc"; "abbbc" ],我们的方法将返回a: 6; b: 6; c: 8

这是我写的:

这段代码在理想情况下是可并行化的,因为其中的每个字符串input都可以在其自己的线程上处理。它并不像看起来那么简单,因为内部循环将项目添加到所有输入之间共享的 Map 中。

我希望将内部循环分解到自己的线程中,并且我不想使用任何可变状态。我将如何使用异步工作流重写此函数?

0 投票
2 回答
1267 浏览

c# - F# 中的异步工作流

我是一名 C# 程序员,但我对 F# 中的异步工作流有疑问。假设我在 C# 类库中有以下类:

我的理解是,我可以在 F# 中创建一个名为 ReadAllAsync 的函数,我可以像这样调用它:

并且它不会阻塞调用线程,而是将其释放到线程池中,然后在操作完成时返回另一个线程。我想我了解如何使用 Async.Primitive 在 F# 中对此进行编码,但我的问题是:我可以从 C# 代码中调用这个 ReadAllAsync 函数吗?如果是这样,我如何将 F# 代码打包到类库中以从 C# 访问?

0 投票
2 回答
1299 浏览

f# - 使用异步工作流进行并行化的最佳实践

假设我想抓取一个网页,并提取一些数据。我很可能会写这样的东西:

告诉 F#在let!另一个线程中执行代码,然后将结果绑定到一个变量,然后继续处理。上面的示例使用了两个 let 语句:一个用于获取响应,一个用于读取所有数据,因此它至少会产生两个线程(如果我错了,请纠正我)。

尽管上面的工作流产生了几个线程,但执行顺序是连续的,因为工作流中的每个项目都依赖于前一个项目。在其他线程返回之前,实际上不可能进一步评估工作流程中的任何项目。

let!在上面的代码中拥有多个有什么好处吗?

如果不是,如何更改此代码以利用多个let!语句?

0 投票
7 回答
26115 浏览

.net - dotNet 中是否有 DirectoryInfo.GetFiles / Directory.GetDirectories 的异步版本?

dotNet 中是否有 DirectoryInfo.GetFiles / Directory.GetDirectories 的异步版本?我想在 F# 异步块中使用它们,并且有一个可以用 AsyncCallbacks 调用的版本会很好。

问题是我试图吸入一堆目录,可能是通过慢速网络连接安装在 SMB 上,我不希望一堆线程池线程在他们可以做其他工作时等待网络读取。

0 投票
3 回答
815 浏览

c++ - 如何保持异步并行程序代码易于管理(例如在 C++ 中)

我目前正在开发一个需要通过网络控制收集设备的服务器应用程序。正因为如此,我们需要做很多并行编程。随着时间的推移,我了解到处理实体(线程/进程/应用程序)之间的通信有三种方法。遗憾的是,这三种方法都有其缺点

A)您可以发出同步请求(同步函数调用)。在这种情况下,调用者会一直等待,直到函数处理完毕并收到响应。例如:

问题是调用者处于空闲状态。有时这不是一个选择。例如,如果调用是由用户界面线程进行的,那么在响应到达之前,应用程序似乎一直处于阻塞状态,这可能需要很长时间。

B)您可以发出异步请求并等待回调。客户端代码可以继续做任何需要做的事情。

这种解决方案的一个很大的缺点是回调函数必须在单独的线程中运行。现在的问题是很难将响应返回给调用者。例如,您单击了对话框中的一个按钮,该按钮异步调用了一个服务,但是当回调到达时,对话框已经关闭了很长时间。

这本身并不是什么大问题。但是,当您要拨打多个此类电话,并且它们都依赖于前一个电话的响应时,根据我的经验,这将变得非常复杂

C)我看到的最后一个选项是发出异步请求并继续轮询,直到响应到达。在 has-the-response-arrived-yet 检查之间,您可以做一些有用的事情。这是我所知道的解决需要进行一系列异步函数调用的情况的最佳解决方案。这是因为它具有很大的优势,即在响应到达时您仍然拥有整个调用者上下文。此外,调用的逻辑顺序仍然相当清晰。例如:

第三种解决方案的问题是您不能从调用者的函数返回。如果您想要在两者之间做的工作与您异步完成的工作完全无关,这将使其不合适。很长一段时间以来,我想知道是否还有其他异步调用函数的可能性,一种没有上面列出的选项的缺点。有没有人有一个想法,也许是一些聪明的把戏?

注意:给出的示例是类 C++ 的伪代码。但是,我认为这个问题同样适用于 C# 和 Java,可能还有很多其他语言。

0 投票
2 回答
2329 浏览

f# - F# 异步 Web 请求,处理异常

我正在尝试在 F# 中使用异步工作流来获取多个 Web 请求。

但是,我的一些请求偶尔会返回错误(例如 http 500),我不知道如何处理。在调试器中运行时,我的 F# 程序似乎陷入了无限循环。

我可能遗漏了一些东西,因为我看到的例子不是开箱即用的。我发现有帮助的第一件事是这段代码:

然后我有一些代码来获取请求,这在我见过的示例中是非常标准的:

然后我尝试得到结果:

但是当我在调试器中运行我的程序时,它会中断,req.EndGetResponse因为服务器返回了内部服务器错误 500。如果我继续执行,它会进入一个时髦的循环,在req.EndGetResponse(有时连续几个)和 let status = Async.RunSynchronously(async_value) 中断.

如何解决异常问题以便获取状态码?另外,我需要上面做的那种类型的事情吗?还是我错过了 F#/VS 2010 Beta 1 的一些库/dll,这已经是其中的一部分?

我实际上使用Async.RunSynchronouslyAsync.Parallel(my_array_of_async_values))并行运行了几个请求,尽管我认为这与我遇到的异常问题无关。

我遇到的示例仅使用Async.Run而不是Async.RunSynchronously可能表明我缺少某些东西的事实... =/

0 投票
2 回答
251 浏览

f# - 让!按顺序执行?

我的印象是让!在 f# 中足够聪明,可以并行执行分配序列。但是,以下示例显示了不同的行为,a、b、c 的赋值似乎是同步执行的。

这是/应该是这样吗?

如果我想并行执行 a、b、c,我应该使用 Async.Parallell ... |> Async.RunSynchronously ... 那么?

上面的示例当然没用,真正的用例可能是查询数据库并同时调用一些 Web 服务。

0 投票
1 回答
1999 浏览

scala - F# 的异步工作流的 Scala 等价物是什么?

F# 的异步工作流的 Scala 等价物是什么?

例如,以下 F# 代码段如何转换为惯用的 Scala?

0 投票
2 回答
423 浏览

f# - 如何在 F# 的 Seq.pick 中使用异步工作流

我一般是函数式编程的新手,最近开始学习 F#。我想使用异步工作流返回Async<'U option>来选择序列中的项目。我找到了一个不错的Seq.pick功能,但我不确定如何将它与异步工作流程一起使用。

如果这不可能,是否有另一种替代方法可以使用命令式样式程序从列表中选择项目。以下是我的程序的修改变体。任何反馈都非常感谢。

感谢期待。

编辑:根据 jpalmer 的回答更新了我的问题。我注意到了这两个Seq.filterSeq.pick更早的情况,并决定这Seq.pick将更好地满足我的需求,因为我需要我能够锁定的第一个项目。但是,我忘记更改函数的返回值 - 而不是返回true,它应该返回Some(item)。现在有了这个更新,有没有一种优雅的方法来解决这个问题,而无需 1)阻塞要转换的线程Async<'U option>'U2)诉诸命令式循环?

0 投票
2 回答
879 浏览

asynchronous - 异步异常处理的意外行为,可能的错误?

我在调用恰好为空的嵌套异步时偶然发现了一个问题。引发了异常,但无法使用异步工作流提供的任何正常异常处理方法捕获它。

以下是重现问题的简单测试:

这导致以下异常:

我真的认为在这种情况下应该捕获异常,或者这真的是预期的行为吗?(我正在使用 Visual Studio 2010 Sp1 进行记录)

此外,Async.CatchAsync.StartWithContinuations表现出与这些测试用例所展示的相同的问题:

似乎在工作流构建器的绑定方法中引发了异常,我的猜测是,因此绕过了正常的错误处理代码。对我来说,这看起来像是异步工作流实现中的一个错误,因为我在文档或其他地方没有发现任何表明这是预期行为的内容。

在大多数情况下,我认为这很容易解决,所以至少对我来说这不是一个大问题,但这有点令人不安,因为这意味着你不能完全相信异步异常处理机制能够捕获所有异常.

编辑:

经过一番思考,我同意kvb。Null asyncs 不应该真的存在于普通代码中,并且只有在你做一些你可能不应该做的事情(例如使用 Unchecked.defaultOf)或使用反射来产生值(在我的情况下它是一个涉及的模拟框架)时才能真正产生. 因此,这不是一个真正的错误,而是更多的边缘情况。