2 つの手順を並行して実行しようとしています。TCL はインタプリタであるため、手順を 1 つずつ処理します。誰かがTCLでマルチスレッドを使用する方法を例で説明できますか?
1 に答える
最近では、Tcl でマルチスレッドを行う通常の方法は、そのThread
拡張機能を使用することです。これは Tcl のコアと共に開発されていますが、特定のプラットフォーム (さまざまな Linux ベースの OS など) では、別のパッケージをインストールして実行する必要がある場合があります。この拡張機能を利用可能にします。
拡張機能が実装するスレッド モデルは、Thread
「インタープリターごとに 1 つのスレッド」です。つまり、各スレッドは 1 つの Tcl インタープリター (およびその子インタープリターは無制限) を「ホスト」できますが、どのスレッドによって実行されるコードも、他のスレッドでホストされているインタープリターにアクセスすることはできません。つまり、Tcl でスレッドを操作する場合は、複数のインタープリターの概念を習得する必要があります。
異なるスレッドで実行されているインタープリター間でデータを交換するための従来のアプローチは、メッセージ パッシングです。異なるスレッドで実行されているターゲット インタープリターの入力キューにスクリプトを投稿し、応答を待ちます。一方、スレッド共有変数 (ロックによる共有メモリの実装) も利用できます。もう 1 つの利用可能な機能は、スレッド プールのサポートです。
"Tcl and threads" wiki ページ、Thread
の拡張マニュアル ページを読んでください。
コード例は wiki にあります。そのうちの1 つを次に示します。
並行して実行する必要があると思われるプロシージャが、ほとんどが I/O バウンド(つまり、ネットワークから何かを読み取ったり、そこに何かを送信したりする) であり、CPU バウンド(重い計算を行う) ではないことに注意してください。 )、処理に対するイベントベースのアプローチでより良い結果が得られる可能性があります。Tcl にはイベント ループのサポートが組み込まれており、データの次のチャンクをチャネルから読み取ることができるときに Tcl にコードを実行させることができます。 (ネットワーク ソケットなど) またはチャネルに書き込まれます。