.NETでのマルチスレッドプログラミング [開発環境]
1. 種類
◆スレッド(Thread)
Threadクラス(System.Threading名前空間)は、指定したメソッドを別スレッドで起動(実行)する仕組みを提供する。スレッドの一時停止や中断、優先順位付けなどを細かく制御することもできる。
ただし、サーバ型のプログラムのように、リクエストを並行して処理するようなプログラムの場合、スレッドの生成・破棄を大量に繰り返す必要が出てくる。スレッドの生成にはそれなりのリソースが消費されるため、単純にこれを繰り返していてはパフォーマンスが低下する。
メリット
・ 各スレッドに優先順位を設定できる
・ スレッドの一時停止/再開/中断を行うことができる
デメリット
・ スレッドの作成と破棄を繰り返すとパフォーマンスが落ちる
・ メソッドにパラメータを設定できない
・ メソッドの戻り値を得るのが困難
◆スレッドプール(ThreadPool)
スレッドプールとは、キューに入れられたリクエスト(処理)をスレッドプールが用意しているスレッドにより次々に実行していく仕組みである。
スレッドプールでは、一度確保したスレッドのリソースをできる限り再利用するように設計されている。そのため、別スレッドで実行したいメソッドを、スレッドプール専用のキューに次々と入れる(登録する)だけで、後は自動的に登録したメソッドが別スレッドで効率よく実行されていく。
メリット
・ 効率よく複数のスレッドを実行できる
・ object型のパラメータを1つだけ設定できる
デメリット
・ パラメータがobject型1つのみ
・ メソッドの戻り値を得るのが困難
・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい
・ 同時に実行できるスレッドの数が制限されている
◆デリゲート(BeginInvoke)
内部的には先のスレッドプールを利用している。しかし、デリゲートによるメソッドの呼び出しは、通常のメソッドの呼び出しと同様にパラメータや戻り値を持つことができる。
デリゲートは「メソッドの呼び出しをラッピングしたもの(包んだもの)」と理解してよい。メソッドをデリゲートでラッピングすると、デリゲートに登録したメソッドを、デリゲートを通じて間接的に呼び出すことができる。これは「メソッド呼び出しの仮想化」と呼ばれる。
複数のメソッドを1つのデリゲートに登録して一度に呼び出したり、登録したメソッドを動的に入れ替えたりすることができ、デリゲートはアプリケーションの設計上極めて便利に働く。
デリゲートに登録されたメソッドを実行するには、普通に実行するInvokeメソッドのほかに、別スレッドでメソッドを実行するBeginInvokeメソッドが使用できる(これらのメソッドはデリゲート・オブジェクトが持つメソッドである)。BeginInvokeメソッドを使用する場合には、デリゲートは上述したスレッドプールを利用して、登録されたメソッドを実行するという仕組みになっている。
メリット
・ メソッドに型のあるパラメータを指定できる
・ 簡単に戻り値を得ることができる
デメリット
・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい
・ 同時に実行できるスレッドの数が制限されている
◆タイマー(Timer)
一定期間ごとにスレッドを呼び出して、指定した処理を実行させる特殊なマルチスレッドの実現方法として、「タイマー」(Timerクラス)という方法
メリット
・一定時間間隔でメソッドを実行することができる
デメリット
・スレッドプールがいっぱいだとうまく動作しない
2. Threadクラスによるマルチスレッド
Imports System
Imports System.ThreadingPublic Class List1_1
Public Shared Sub Main()
Dim threadA As New Thread( _
New ThreadStart(AddressOf ThreadMethod)) ' (1)threadA.Start() ' (2)
For i As Integer = 0 To 99
Thread.Sleep(5)
Console.Write(" B ")
Next i
End Sub' 別スレッドで動作させるメソッド
Private Shared Sub ThreadMethod()
For i As Integer = 0 To 99
Thread.Sleep(5)
Console.Write(" A ")
Next i
End SubEnd Class
参考サイト
WordPressによるサイト運営[1] [WordPress]
今までブログにアップしてきた情報を体系的に整理し内容を充実させること、また昨年から考えてきたWEBサービス開発のスタートを具体化するため、WEBサイトを新たに構築することにした。
サイトの主目的はブログとするが、固定ページも準備しテーマごとに内容をまとめることにする。さらにWEBサービスをリーンスタートアップのためにWEBサービスの実験、発表場所としても利用する。
WEBサービス開発に関してはゼロからのスタートとなるので、何が出来るか全く白紙状態だけど、環境を準備することでとにかく早く開始することを重視した。そのため一からサイトを構築することは避け、WordPress上に構築することにした。
全体のスケジュールはおよそ以下の手順を一ヶ月程度で構築する予定。その進捗をブログにアップしながら進めていく。今回は「1.ローカル開発環境準備」を行ったので同時にアップした。
- ローカル開発環境の準備
- サイトマップ設計
- ローカル環境上に、雛形となるサイト構築(固定ページはテキストのみ)
- サーバにアップし運用開始
- 固定ページのワイヤーフレーム設計(TOPページ、情報ページ等)
- 固定ページの制作とサーバへのアップ
- WordPressプラグインによるサイト機能の充実
「ローカル開発環境の準備」
ベースにWordPressを利用すること、WEBサービス開発を行う予定のため、MacBook Air上に基本的なサーバー機能が必要になる。そのため「XAMPP」を導入しアパッチサーバーとMySQLデータベースを利用できるようにした。そして「XAMPP」上で「WordPress」が走るようにセットアップした。また固定ページ作成用のHTMLエディターとして、WYSIWYG編集ができる無償の「BlueGriffon」を選択した。
参考資料
ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージとしてまとめたもので、apachefriends.orgから提供されている。主として開発用あるいは学習用ではあるが、イントラネットなどにおいて実運用環境として使われることもある。
http://www.apachefriends.org/jp/xampp-macosx.html
インストール方法に関しては、上記のサイトに詳しく書いてある。
オープンソースのブログソフトウェアである。PHPで開発されており、データベース管理システムとしてMySQLを利用している(後述のプラグインよりSQLiteでの使用も可能)。単なるブログではなくCMSとしてもしばしば利用されている。b2/cafelogというソフトウェアの後継として開発された。GNU General Public License(GPL)の下で配布されている。
http://ja.wordpress.org/install/
ここのサイトからZIPファイルをダウンロードおよび解凍後のWordPressフォルダを、XAMPPフォルダーの”htdocs”フォルダー内にコピーする。
XAMPPから”Apache”、”MySQL”、”ProFTPD”をスタート後、ブラウザから”http://localhost/WordPress”へアクセスし「wp-config.php ファイルが見つかりません。開始する前にこのファイルが必要です。」との警告、”設定ファイルを作成する”ボタンを押してセットアップを開始する。
Webオーサリングツールのひとつ。WYSIWYG方式でのウェブページの編集が行える。フリーソフトウェアであり、無料で配布されている。
http://sourceforge.jp/projects/bluegriffon/
上記のサイトからマック用インストーラ”bluegriffon-20090112-ja_JP.dmg”をダウンロードしインストールする。
参考サイト
- http://ja.wikipedia.org/wiki/XAMPP
- http://ja.wikipedia.org/wiki/WordPress
- http://ja.wikipedia.org/wiki/BlueGriffon