問題タブ [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.
ocaml - Lwt_pool の使用方法
最大接続数の Redis データベース接続のプールが必要です。私が探しているソリューションのように見えますLwt_pool
が、どのように機能するかはよくわかりません。たとえば、私が持っているいくつかの質問:
ドキュメント
Lwt_pool
は、開いている接続を再利用するのに優れていると述べていますが、プールはどの接続が再利用可能かをどのように知るのでしょうか? 私が見る限り、それを通知する特定の方法はなく、API はuse
メソッドを提供するだけです。Lwt
それがどのように機能するかを学ぶために、ドキュメントよりも優れたリソースはありますか? コード例やそれに関する多くのリソースを簡単に見つけることができません。
ocaml - Lwt_main.run() の適切な使用
使用中にエラーが発生しましたLwt_main.run()
。基本的に、2 つのタイプの無限ループがunit -> 'a Lwt.t = <fun>
あり、両方のループを開始するとエラーが発生します。1 つのループがライター ループで、もう 1 つのループがリーダー ループであるというコンテキストでこれらを使用しています。基本的に、リーダーで使用するよりも頻繁にライターでデータを更新する必要があります。私が受け取ったエラーは、以下のコードで説明できます。
エラーなしで次のように Lwt_main.run ステートメントを実行できますが、この解決策は、警告を修正するのではなく、ワイルドカードで警告をマスクしているようです。
Lwt_main.run()
ワイルドカード文字でエラーをマスクする代わりにエラーを修正できるように、このコンテキストでの適切な使用法は何ですか?
ocaml - Lwt を使用して特定のディレクトリからプロセスを正しく開始する方法
関数、およびを使用して、 Lwtで特定のディレクトリからプロセスを開始するのは簡単です。Sys.getpwd
Lwt_unix.chdir
Lwt_process.exec
- 現在の作業ディレクトリ
Sys.getpwd
を保存するために使用します Lwt_unix.chdir
特定のディレクトリに移動するために使用しますLwt_process.exec
外部プロセスの開始に使用Lwt_unix.chdir
保存された現在の作業ディレクトリに移動するために使用します
このロジックには欠陥があります。スケジューラが への最初の呼び出しのLwt_unix.chdir
後、および への呼び出しの後に別のスレッドを実行できるため、保存された現在のディレクトリではなく特別なディレクトリLwt_process.exec
でこのスレッドが実行されるからです。私が説明したような競合状態を導入することなく、 Lwtを使用して特別なディレクトリからプロセスを簡単に開始することは可能ですか?
ocaml - Labltk で Lwt を使用するには?
Lwt を使用し、Tk インターフェイスと対話するプログラムを作成する方法。LwtプリエンプティブスレッドでTkメインスレッドを実行しようとしました
wheremain
はインターフェイスを構築し、それを更新するスレッドを実行します。これにより、致命的なエラー (ウィジェットを作成できない) でプログラミングがクラッシュし、その後、コア ダンプが発生します。
Lwt と Labltk を一緒に使用する正しい方法は何ですか?
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 のドキュメントでそのような関数を見つけることができませんでした。
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.close
with_connection のオプションのfd
引数に与えられた raw fd で使用されても、同様の悪い結果が得られます。
編集IV:最も陰湿なのは、私が使用する場合Lwt_daemon.daemonize
、この問題は一見消えます