4

私は用語を理解しようとしていlwt supportedます。


したがって、データベースに接続してデータを書き込むコードがあるとします: Db.write conn data. まだ lwt とは関係がなく、各書き込みには10 sec.

さて、lwtを使いたいと思います。以下のように直接コーディングできますか?

let write_all data_list = Lwt_list.iter (Db.write conn) data_list
let _ = Lwt_main.run(write_all my_data_list)

5にデータ項目がmy_data_listあることをサポートします。5 つのデータ項目すべてがデータベースに順番に書き込まれますか、それとも並行して書き込まれますか?


また、手動で Lwt またはhttp://ocsigen.org/tutorial/applicationで、彼らは言う

Lwt の使用は非常に簡単であり、ブロッキング関数 (非協調関数) を使用しない限り、問題は発生しません。ブロック機能により、entre サーバーがハングする可能性があります。

ブロック機能を使用しない方法がよくわかりません。自分の機能ごとに、それを作成するために使用できLwt.returnますlwt supportか?

4

1 に答える 1

4

はい、あなたのコードは正しいです。の原則はlwt supported、コード内で時間がかかる可能性があるものはすべて Lwt 値を返す必要があるということです。

iter_pLwt_list.iter については、次のいずれかを選択することで、処理を並列にするか順次にするかを選択できますiter_s

iter_s fl では、iter_s は l の各要素に対して f を呼び出し、各要素間の完了を待ちます。逆に、iter_p fl では、iter_p は l のすべての要素に対して f を呼び出し、すべてのスレッドが終了するのを待ちます。

ノンブロッキング関数については、軽量スレッドの原則は、「協調ポイント」に到達するまで実行し続けることです。つまり、スレッドが安全に中断できるポイント、またはsleep.

ただし、実際にsleep. これが Unix ライブラリ全体がラップされている理由であり、時間のかかる操作 (たとえば ) を実行したい場合は、write自動的に連携ポイントに到達します。

独自の機能について、Unix の IO 操作を使用する場合は、代わりに Lwt バージョン (Lwt_unix.sleepの代わりにUnix.sleep)を使用する必要があります。

于 2013-07-02T10:46:52.970 に答える