- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
几天来,我一直在关注猫效应和 IO。我觉得我对这种效果有一些误解,或者只是我错过了它的重点。
IO.shift
?使用 IO.async
?是 IO.delay
同步还是异步?我们可以用这样的代码来做一个通用的异步任务 Async[F].delay(...)
?或者当我们使用 unsafeToAsync
调用 IO 时发生异步或 unsafeToFuture
? 最佳答案
if IO can replace Scala's Future, how can we create an async IO task
Future
,有点糊。说,如果我写:
Future { (1 to 1000000).foreach(println) }
for {
_ <- IO.shift
_ <- IO.delay { (1 to 1000000).foreach(println) }
} yield ()
IO.shift
用于可能更改线程/线程池。 Future
在每个操作上都这样做,但它在性能方面不是免费的。 IO.delay
{ ... } (a.k.a. IO { ... }
) 不会使任何异步并且不会切换线程。它用于创建简单的 IO
来自同步副作用 API 的值 Future
的 API或 Java 的
CompletableFuture
,或类似 NIO
CompletionHandler
,这一切都可以转换为回调。这是什么
IO.async
用于:您可以转换任何
函数采用回调 到
IO
.在这种情况下:
for {
_ <- IO.async { ... }
_ <- IO(println("Done"))
} yield ()
Done
将仅在
...
中的计算时(以及如果)打印回电。您可以将其视为阻塞绿色线程,而不是 OS 线程。
IO.async
用于将任何已经异步的计算转换为 IO
. IO.delay
用于将任何完全同步的计算转换为 IO
. Future
时最接近的类比s 正在创建
scala.concurrent.Promise
并返回
p.future
.
Or async happens when we call IO with unsafeToAsync or unsafeToFuture?
IO
,除非您调用其中之一(或使用
IOApp
),否则不会发生任何事情。但是 IO 并不能保证你会在不同的操作系统线程上执行,甚至异步执行,除非你用
IO.shift
明确要求这样做。或
IO.async
.
(IO.shift *> myIO).unsafeRunAsyncAndForget()
.这是可能的,正是因为
myIO
在被要求之前不会被执行,无论你是否拥有它
val myIO
或
def myIO
.
Future
也不可能做到这一点也不与
IO
.
What's the point of Async and Concurrent in cats-effect? Why they are separated?
Async
和
Concurrent
(和
Sync
)是类型类。它们的设计是为了让程序员可以避免被锁定到
cats.effect.IO
并且可以为您提供支持您选择的任何 API 的 API,例如 monix Task 或 Scalaz 8 ZIO,甚至 monad 转换器类型,例如
OptionT[Task, *something*]
.诸如 fs2、monix 和 http4s 之类的库使用它们来为您提供更多选择来使用它们。
Concurrent
在
Async
之上添加额外的东西,其中最重要的是
.cancelable
和
.start
.这些与
Future
没有直接的类比。 ,因为那根本不支持取消。
.cancelable
是
.async
的一个版本这还允许您指定一些逻辑来取消您正在包装的操作。一个常见的例子是网络请求 - 如果您不再对结果感兴趣,您可以中止它们而无需等待服务器响应,并且不会在读取响应时浪费任何套接字或处理时间。你可能永远不会直接使用它,但它有它的地方。
.start
进来。简而言之,
.start
是一个绿色线程的显式分支。
someIO.start
类似于做
val t = new Thread(someRunnable); t.start()
,除了它现在是绿色的。和
Fiber
本质上是
Thread
的精简版API:你可以做
.join
,就像
Thread#join()
,但它不会阻塞操作系统线程;和
.cancel
,这是
.interrupt()
的安全版本.
val ids: List[Int] = List.range(1, 1000)
def processId(id: Int): IO[Unit] = ???
val processAll: IO[Unit] = ids.parTraverse_(processId)
.race
:
val fetchFromS3: IO[String] = ???
val fetchFromOtherNode: IO[String] = ???
val fetchWhateverIsFaster = IO.race(fetchFromS3, fetchFromOtherNode).map(_.merge)
.start
并使用
Fiber
不是 fork 更多绿色线程的唯一方法,只是最明确的方法。答案是:
Is IO a green thread? If yes, why is there a Fiber object in cats-effect? As I understand the Fiber is the green thread, but docs claim we can think of IOs as green threads.
IO
就像一个绿色线程,这意味着您可以在没有操作系统线程开销的情况下并行运行许多它们,并且 for-comprehension 中的代码表现得好像它正在阻塞要计算的结果。 Fiber
是一个用于控制绿色线程显式 fork (等待完成或取消)的工具。 关于scala - Cats 效应和异步 IO 细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53682686/
如何从表中选择结果,其中 cat = '$cat',如果不相等,则从 cat 中选择所有结果,无论 $cat 是什么。这是我的查询 $sql = mysql_query("SELECT * FROM
如标题中的示例,我想要结果: 目录:home/tom/cat 第一次剪辑:tom/cat 第二次切割:/cat 最后一刀:/ 如何在 python 中实现? 最佳答案 这是您要找的吗: In [101
使用循环,我可以创建 My cat is: Cat1 ... My cat is: Cat1 但是,当我尝试使用 Cat ("cat"+i) = new Cat("Cat" + i); 我犯错了.
我目前正在用 C 和 unix 开发一个 cat 命令。这次我的任务是设计 cat -b 和 cat -s 命令。但是我已经创建了其他命令,例如 -t、-v、-n、-e。我卡在了命令 -b 中,因为每
我理解这一点的方式是命令 cat file 将显示文件的内容并 cat < file 将把文件的内容作为输入。我正在尝试这个并创建了两个文件。一个名为 file1.txt,另一个名为 file2.tx
我理解这一点的方式是命令 cat file 将显示文件的内容并 cat < file 将把文件的内容作为输入。我正在尝试这个并创建了两个文件。一个名为 file1.txt,另一个名为 file2.tx
我有一个程序可以同时读取两个输入文件。我想从标准输入中读取这个程序。我以为我会使用这样的东西: $program1 <(cat) <($program2) 但我刚刚发现 cat <(cat) 产生 .
管道的正式定义指出左侧文件的 STDOUT 将立即通过管道传输到右侧文件的 STDIN。我有两个文件,hello.txt 和 human.txt 。 cat hello.txt 返回 Hello 并且
我想编写一个 shell 脚本,它接受来自标准输入的数据,将它写入一个文件,然后用它做一些事情。 出于这个问题的目的,让我们假设我的脚本应该接受标准输入,将其写入 in.txt ,然后 grep 一个
有没有办法让cat , less等打印制表符而不是制表符被转换为空格?当我将代码从终端复制到编辑器时,我对此很恼火。 最佳答案 我在这里看到两个问题。 首先,目标编辑器可以将 TAB 转换为空格数。一
我刚刚发现执行 find . 比执行 find 慢。 |猫。这是在我的主目录中执行 time find . 3 次的结果: First: real 0m4.385s user 0m0.54
我相信该程序适用于除一个以外的大多数情况。我在 indexOF() 中添加了空格,所以像 cathrine 和 dogsuit lammas 这样的词都会被认为是非亵渎的。我看到的唯一问题是用户是否以
解决方案: 不支持 data-* 属性。您可以定义自己的属性并使用 getAttribute 调用它们。就我而言, this.dataset.cat 变为 this.getAttribute("cat
这是让我“我该怎么办?”的问题之一 这是我遇到的编译器错误: 在“SKFootmanSprite”类型上使用实例成员“getAttackUPSequence_Frames”您是否打算改用“SKFoot
我想将 2 个不同的 cat 语句合并为一个 cat 语句 cat /dir1/file1.cfg | grep -q "linux" cat /dir1/file2.cfg | grep -q "l
我已经在 C 中使用系统调用(打开、读取和写入)来模拟 Linux 系统中的“猫”功能,并且它比真实的慢... 我正在使用与真正的“cat”相同的缓冲区大小,并使用“strace”我认为它进行相同数量
我在不同的示例、教程、博客等中看到过这两种格式,但就我的生活而言,我找不到对差异的解释。有什么区别 ICriteria crit = session.CreateCriteria(typeof(Cat
我在不同的示例、教程、博客等中看到过这两种格式,但就我的生活而言,我找不到对差异的解释。有什么区别 ICriteria crit = session.CreateCriteria(typeof(Cat
我有一个包含列的表:(project_id, name) 这是一个人员列表,每个人都有其所属的项目。如果一个人在两个项目中,则重复。 我想提取一个包含以下列的表:(project_id, people
我想提取 git 存储库中保存的文件的最新版本的副本,并将其传递到脚本中进行某些处理。对于 svn 或 hg,我只使用“cat”命令: Print the specified files as the
我是一名优秀的程序员,十分优秀!