- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建Lwt的并发示例,并提出了这个小样本
let () =
Lwt_main.run (
let start = Unix.time () in
Lwt_io.open_file Lwt_io.Input "/dev/urandom" >>= fun data_source ->
Lwt_unix.mkdir "serial" 0o777 >>= fun () ->
Lwt_list.iter_p
(fun count ->
let count = string_of_int count in
Lwt_io.open_file
~flags:[Unix.O_RDWR; Unix.O_CREAT]
~perm:0o777
~mode:Lwt_io.Output ("serial/file"^ count ^ ".txt") >>= fun h ->
Lwt_io.read ~count:52428800
data_source >>= Lwt_io.write_line h)
[0;1;2;3;4;5;6;7;8;9] >>= fun () ->
let finished = Unix.time () in
Lwt_io.printlf "Execution time took %f seconds" (finished -. start))
OS X
最新版本,并使用
ocamlfind ocamlopt -package lwt.unix main.ml -linkpkg -o Test
/dev/random
,是的,我正在使用挂钟时间。)
最佳答案
因此,您的代码有一些问题。
第1期
主要问题是您对Lwt_io.read
函数的理解不正确(没有人能责怪您!)。
val read : ?count : int -> input_channel -> string Lwt.t
(** [read ?count ic] reads at most [len] characters from [ic]. It
returns [""] if the end of input is reached. If [count] is not
specified, it reads all bytes until the end of input. *)
~count:len
,它将最多读取
个
len
字符。最多意味着它可以读更少。但是,如果省略
count
选项,则它将读取所有数据。我个人认为这种行为不是很直觉,即使不是很奇怪。因此,这最多意味着最多
len
或更少,即,不能保证它将准确地读取
len
字节。实际上,如果将支票添加到程序中:
Lwt_io.read ~count:52428800 data_source >>= fun data ->
Lwt_io.printlf "Read %d bytes" (String.length data) >>= fun () ->
Lwt_io.write h data >>= fun () ->
4096
字节:
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
Read 4096 bytes
4096
?因为这是默认的缓冲区大小。但这实际上并不重要。
Lwt_io
模块实现了一个缓冲的IO。这意味着您的所有写入和读取操作都不会直接进入文件,而是会缓存在内存中。这意味着,您应该记住
flush
和
close
。您的代码并没有完全关闭描述符,因此您可能会遇到这样的情况:程序终止后,某些缓冲区没有被清除。特别是
Lwt_io
,在程序退出之前刷新所有缓冲区。但是,您不应该依赖此未记录的功能(将来,当您尝试其他任何缓冲的io(例如来自标准C库的fstream)时,它可能会打击您)。因此,请始终关闭文件(另一个问题是,今天的文件描述符是最宝贵的资源,而且很难发现它们的泄漏)。
/dev/urandom
或
/dev/random
来测量io。对于前者,您将测量随机数生成器的性能,对于后者,您将测量机器中的熵流。两者都很慢。根据您的CPU速度,您很少会获得超过16 Mb/s的速度,而实际速度却远远低于16 Mb/s,因此
Lwt
可以吞吐。从
/dev/zero
读取并写入
/dev/null
实际上将执行内存中的所有传输,并显示实际速度,这可以通过程序来实现。编写良好的程序仍将受到内核速度的限制。在下面提供的示例程序中,这将显示700 MB/s的平均速度。
Lwt_io.read
将首先在缓冲区读取,然后将创建
string
并将数据复制到该字符串。如果确实需要一些性能,则应提供自己的缓冲。在大多数情况下,不需要这样做,因为
Lwt_io
的性能很高。但是,如果您需要每秒处理数十兆字节,或者需要一些特殊的缓冲策略(非线性的东西),则可能需要考虑提供自己的缓冲。好消息是
Lwt_io
允许您执行此操作。您可以看一下
example程序,该程序将测量
Lwt
输入/输出的性能。它模仿了一个著名的
pv
程序。
/dev/random
(以及
/dev/zero
)是仅受CPU限制的一种设备。这与调用
random
函数相同。它将始终为
available
,因此不会在其上阻止任何系统调用。写入常规文件也不是实现并发的好地方。首先,通常只有一个硬盘驱动器,其中有一个写磁头。即使系统调用将阻塞并放弃对另一个线程的控制,这也会导致性能下降,因为两个线程现在将争夺头位置。如果您有SSD,那么标题将不会有任何竞争,但是性能会变差,因为您会破坏缓存。但幸运的是,通常不会在常规文件上进行写操作。因此,您的线程将因此运行,即它们将被序列化。
关于ocaml - 为什么这种基于Lwt的看似并发的代码如此不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31153693/
我正在尝试使用 Lwt 编写一个终端应用程序。基本上,只要我的应用程序正在运行,我就需要使用 Lwt_io.read_line 观察终端的输入。 有没有比下面的(伪代码)更好的方法来在我的程序运行时实
有关 Ocaml Lwt 中该符号含义的任何建议: >>= 最佳答案 参见 API manual : val bind : 'a t -> ('a -> 'b t) -> 'b t bind t f
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
这是一个使用 Unix 模块与子进程交互的简单程序。我只是启动一个 cat shell 命令,向它发送一个字符串并读回它: #load "unix.cma";; (* Needed if you ar
我想为一个简单的客户端尝试使用 Lwt_unix 模块,该客户端读取套接字中的数据,直到没有任何数据可读为止。有人告诉我 Lwt 创建非阻塞套接字,但使用我的代码,它仍然是阻塞的: open Lwt
我试图理解术语 lwt supported . 所以假设我有一段连接数据库并写入一些数据的代码:Db.write conn data .它还与 lwt 无关,每次写入将花费 10 sec . 现在,我
我有 6 个复制因子为 3 的节点集群。我使用普通一致性级别作为 QUORUM,串行一致性级别作为 SERIAL。 我有一个条件写入查询(IF EXIST)。如果我使用如下所示的 datastax j
我目前正在学习Lwt .我对使用异步进程用 OCaml 例程替换一些 shell 例程很感兴趣。 让我们看一下简化的第一次尝试,其中通过组合运行 cat 的两个线程来创建过滤器: let filter
我正在MirageOS(Unix)上用Ocaml开发一个Web服务,此刻我在Lwt.async()上遇到了一些麻烦。 Lwt文档指出以下内容: val async : (unit -> 'a t) -
运行 opam install cohttp不为我提供 cohttp.lwt在 findlib 中。我是否缺少使用 lwt 支持进行安装的命令行选项? 最佳答案 lwt是 cohttp 的可选依赖项.
我在通过 Godi 安装的 Ubuntu 上运行 Ocaml 3.12。 我正在浏览 Lwt tutorial .我已经启动了顶层并完成了(按照指示): # #use "topfind";; # #r
我有两个表,模型如下: CREATE TABLE IF NOT EXISTS INV ( CODE TEXT, PRODUCT_CODE TEXT, LOCATION_NUMBER TEX
(交叉发布到 lwt github 问题) 我已将我的用法归结为此代码示例,该示例将泄漏文件描述符。 假设你有: #require "lwt.unix" open Lwt.Infix let echo
可以像这样查看一个进程的所有线程的优先级和调度策略: ps H -o 'tid pri cls comm' PID 如何从命令行更改单个线程的优先级? 像renice 和chrt 这样的命令似乎影响了
我在 utop 上调用 require "lwt.simple-top";; 并尝试一个简单的示例,但它无法找到运算符 >>=。 最佳答案 #require 是一个顶层指令,它将库代码链接到顶层。它不
我正在尝试运行 LWT在我的 Mac 上并为此安装了 MAMP。我关注了these instructions ,但是当我尝试访问 http://localhost:8888/lwt/ 时,我得到: T
Cassandra 轻量级事务是否使用隐含的 SET,因此在主键方面不能有 IF 部分? 我问是因为 Datastax Cassandra Java 驱动程序(版本 2.1.5)在我准备语句时抛出 I
我正在尝试使用js_of_ocaml和node.js。如您所知,node.js 大量使用回调来实现异步请求,而无需引入显式线程。 在 OCaml 中,我们有一个非常好的线程库 Lwt,带有非常有用的语
我是一名优秀的程序员,十分优秀!