問題タブ [ocaml-lwt]

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 に答える
164 参照

ocaml - Lwt_pool の使用方法

最大接続数の Redis データベース接続のプールが必要です。私が探しているソリューションのように見えますLwt_poolが、どのように機能するかはよくわかりません。たとえば、私が持っているいくつかの質問:

  • ドキュメントLwt_poolは、開いている接続を再利用するのに優れていると述べていますが、プールはどの接続が再利用可能かをどのように知るのでしょうか? 私が見る限り、それを通知する特定の方法はなく、API はuseメソッドを提供するだけです。

  • Lwtそれがどのように機能するかを学ぶために、ドキュメントよりも優れたリソースはありますか? コード例やそれに関する多くのリソースを簡単に見つけることができません。

0 投票する
1 に答える
530 参照

ocaml - Lwt_main.run() の適切な使用

使用中にエラーが発生しましたLwt_main.run()。基本的に、2 つのタイプの無限ループがunit -> 'a Lwt.t = <fun>あり、両方のループを開始するとエラーが発生します。1 つのループがライター ループで、もう 1 つのループがリーダー ループであるというコンテキストでこれらを使用しています。基本的に、リーダーで使用するよりも頻繁にライターでデータを更新する必要があります。私が受け取ったエラーは、以下のコードで説明できます。

エラーなしで次のように Lwt_main.run ステートメントを実行できますが、この解決策は、警告を修正するのではなく、ワイルドカードで警告をマスクしているようです。

Lwt_main.run()ワイルドカード文字でエラーをマスクする代わりにエラーを修正できるように、このコンテキストでの適切な使用法は何ですか?

0 投票する
1 に答える
219 参照

ocaml - Lwt を使用して特定のディレクトリからプロセスを正しく開始する方法

関数、およびを使用して、 Lwtで特定のディレクトリからプロセスを開始するのは簡単です。Sys.getpwdLwt_unix.chdirLwt_process.exec

  1. 現在の作業ディレクトリSys.getpwdを保存するために使用します
  2. Lwt_unix.chdir特定のディレクトリに移動するために使用します
  3. Lwt_process.exec外部プロセスの開始に使用
  4. Lwt_unix.chdir保存された現在の作業ディレクトリに移動するために使用します

このロジックには欠陥があります。スケジューラが への最初の呼び出しのLwt_unix.chdir後、および への呼び出しの後に別のスレッドを実行できるため、保存された現在のディレクトリではなく特別なディレクトリLwt_process.execでこのスレッドが実行されるからです。私が説明したような競合状態を導入することなく、 Lwtを使用して特別なディレクトリからプロセスを簡単に開始することは可能ですか?

0 投票する
1 に答える
167 参照

ocaml - Labltk で Lwt を使用するには?

Lwt を使用し、Tk インターフェイスと対話するプログラムを作成する方法。LwtプリエンプティブスレッドでTkメインスレッドを実行しようとしました

wheremainはインターフェイスを構築し、それを更新するスレッドを実行します。これにより、致命的なエラー (ウィジェットを作成できない) でプログラミングがクラッシュし、その後、コア ダンプが発生します。

Lwt と Labltk を一緒に使用する正しい方法は何ですか?

0 投票する
1 に答える
986 参照

unit-testing - Asyncを使用してタイムアウト関数を書くOCaml

関数を評価しようとする関数を作成しようとしていますが、特定のタイムアウト後に停止します。

を使用しようとしましたDeferred.any。これは、基になる遅延オブジェクトの 1 つが満たされると、満たされる遅延オブジェクトを返します。

遅延モナドから値を抽出する方法がわからなかったので、基になる値が決定されるまでスピンする関数「wait_for」を作成しました。

これはうまくいきませんでした。Real World OCaml の Async の章を読んだ後、スケジューラを起動する必要があることに気付きました。Schedule.goただし、コードのどこで呼び出すかはわかりません。go : ?raise_unhandled_exn:bool -> unit -> Core.Std.never_returns非同期コードを実際に返したいコードのどこに型が収まるかわかりません。のドキュメントには、「非同期プログラムは呼び出されるgoまで終了しない」と書かれています。shutdown

このコーネルのウェブサイトで同じ問題に対する非常によく似た解決策を見つけるまで、私は問題に対して完全に間違ったアプローチをとったのではないかと疑い始めていました

とにかく、私の使用法wait_forが正しいかどうかはよくわかりません。遅延モナドから値を抽出する標準的な方法はありますか? また、スケジューラを起動するにはどうすればよいですか?

Core.Std.Thread更新: と のみを使用してタイムアウト関数を作成しようとしましたCore.Std.Mutex

これはかなり実用に近いと思います。のような計算let rec loop x = print_string ".\n"; loop xでは機能しますが、 のような計算では機能しませんlet rec loop x = loop x。現在の問題は、計算f ()が無限にループする場合、そのスレッドがプリエンプトされないため、他のスレッドがタイムアウトに気付かないことだと思います。スレッドが文字列を出力するような IO を行う場合、スレッドは横取りされます。また、スレッドを強制終了する方法もわかりません。Core.Std.Thread のドキュメントでそのような関数を見つけることができませんでした。

0 投票する
2 に答える
289 参照

ocaml - Lwt がファイル記述子をリークしています。バグなのか自分のコードなのかわかりません

(lwt githubの問題にクロス投稿)

ファイル記述子をリークするこのコード サンプルの使用法を煮詰めました。

あなたが持っていると言う:

次に、次を使用して単純なサーバーを作成します。

nc -l 2001

そしてOCamlコードを起動しましょう utop example.ml

次に、クライアントを開きます

次に、lsof を使用してポート 2000 の接続を見ると、

実際、 を使用するたびに、lsof の使用から残りのレコードをnc localhost 2000取得します。CLOSE_WAIT

最終的に、これはシステムがファイル記述子を使い果たすことにつながります。これは、ほとんど迷惑なことにプログラムをクラッシュさせることはありませんが、Lwt がハングアップすることにつながります。

私が何か間違ったことをしているのか、それともこれが本物のバグなのかはわかりません。いずれにせよ、これは私にとって深刻なバグであり、10時間以内にファイル記述子を使い果たします...

編集:問題は、接続の一方が閉じられているが、もう一方が閉じられていないことだと思われます。with_connectionどちらかの側が閉じるたびに、別名いつでも閉じても、クリーンアップ/クローズアップnc_icする必要があると思いましたnc_oc

編集 II: で記述子を手動で閉じるあらゆる方法を試しましたLwt_io.closeが、まだ CLOSE_WAIT メッセージが表示されます。

編集 III: Lwt_unix.closewith_connection のオプションのfd引数に与えられた raw fd で使用されても、同様の悪い結果が得られます。

編集IV:最も陰湿なのは、私が使用する場合Lwt_daemon.daemonize、この問題は一見消えます