スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
なぜ今Pythonか? Pythonをお薦めする18の理由
プログラムのパタン演習 解説.
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
4章 制御の流れ-3.
プログラミング基礎I(再) 山元進.
プログラミング言語としてのR 情報知能学科 白井 英俊.
オペレーティングシステム (プロセス管理)
最短路問題をGurobiで解こう! 流通最適化工学 補助資料.
Servlet J2EE I 第8回 /
Iアプリプログラミング その1  鳥居秀徳.
アルゴリズムとプログラミング (Algorithms and Programming)
Lightweight Language Weekend ls-lRシェル
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
VBA H106077 寺沢友宏.
プログラミング基礎I(再) 山元進.
最適化ソルバーのための Python言語入門
オペレーティングシステムJ/K 2004年10月7日
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
シミュレーション物理5 運動方程式の方法: サブルーチンの使い方.
Ruby勉強会(第1回) 2006/06/29 竹内豪.
Bottle/Pythonによる Webアプリ入門
情報基礎A 第11週 プログラミング入門 VBAの基本文法3 配列・For~Next
変数のスコープの設計判断能力 を育成するプログラミング教育
の まとめ 2007/04/02 (Mon) / d;id:hzkr
ベイジアンネットワーク概説 3.6 構造の探索アルゴリズム
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
ピカチュウによる オブジェクト指向入門 (新版)
CONCURRENT PROGRAMMING
第7回 条件による繰り返し.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オペレーティングシステム (プロセス管理)
B演習(言語処理系演習)第8回 評価器 田浦.
C言語でスレッド (Pthread) 2007年1月11日 海谷 治彦.
関数の定義.
マルチスレッド処理 マルチプロセス処理について
デバッガ dbx の使い方.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
変数,式,関数,クラス,コンストラクタ, クラスの属性アクセス,メソッド,親クラ スからの継承
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 2010年7月26日
Python講座 2017/5/11(木).
アルゴリズムとデータ構造 2011年7月8日課題の復習
ファイルの読み込み #!/usr/bin/env perl #Perlスクリプトの指定 open(FILE, "food.txt");
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
統計ソフトウエアRの基礎.
プログラミングⅡ 第2回.
アルゴリズムとデータ構造1 2008年7月24日
C#プログラミング実習 第2回.
6.5 セマフォ セマフォ(semaphore): 複数のタスク(もしくはスレッド)が「同期」または「相互排除」の制御のために取得(acquire)・リリース(release)できるカーネルオブジェクトの総称.
オペレーティングシステムJ/K (並行プロセスと並行プログラミング)
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
SMP/マルチコアに対応した 型付きアセンブリ言語
モジュール分割.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
全体ミーティング(9/15) 村田雅之.
オペレーティングシステム (プロセス管理)
君ならどうする – ls-lRシェル Python編
情報処理Ⅱ 小テスト 2005年2月1日(火).
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
Presentation transcript:

スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成 Lockオブジェクトの使用例: Lock_Object.py スレッドの使用例: spawn_thread.py スレッドの使用例: spawn_thread_exit.py スレッドの使用例: thread_count.py スレッドの使用例: thread_mutex.py スレッドの使用例: thread_count_wait.py

スレッドの同期 スレッドを使うとき、複数のスレッドが共有する資源(グローバル変数など)にアクセスすることがあります。 このようなとき、適切にスレッドの同期を取らないと、正しく動作しないことがあります。 Pythonには、同期を取るためのオブジェクトがいくつか用意されています。 以下にPythonの同期オブジェクトを示します。 Lockオブジェクトは、最も簡便な同期機構である。Lockオブジェクトは、mutexや、binaryセマフォとも呼ばれている。

Lockオブジェクト: lockオブジェクトの生成 mtx = allocate_lock() 新しいロックオブジェクトを返します。 ロックは初期状態としてアンロック状態です。

Lockオブジェクト: lock状態の獲得 mtx.acquire([waitflag]) オプションの引数なしで使用すると、このメソッドは他のスレッドがロックしているかどうかにかかわらずロックを獲得し、None を返します。 ただし他のスレッドがすでにロックしている場合には解除されるまで待ってからロックを獲得します (同時にロックを獲得できるスレッドはひとつだけであり、これこそがロックの存在理由です)。 整数の引数 waitflag を指定すると、その値によって動作が変わります。引数が 0 のときは、待たずにすぐ獲得できる場合にだけロックを獲得します。0 以外の値を与えると、先の例と同様、ロックの状態にかかわらず獲得をおこないます。 なお、引数を与えた場合、ロックを獲得すると True、できなかったときには False を返します。

Lockオブジェクト: lock状態の開放 mtx.release() ロックを解放します。 そのロックは既に獲得されたものでなければなりませんが、同じスレッドによって獲得されたものである必要はありません。

Lockオブジェクトの使用例 Lock_Object.py import thread, time n = 0 lck = thread.allocate_lock() def fadd() : global n, lck while 1: if lck.acquire() == 0 : pass else : n += 1 lck.release() time.sleep(2) def fdec() : n -= 1 time.sleep(3) thread.start_new_thread(fadd, ()) thread.start_new_thread(fdec, ()) print n Lock_Object.py

スレッドの使用例: spawn_thread.py mutexなし. import sys, time import thread def childThread(thread_id): while 1: print ' Hello from thread', thread_id time.sleep(1) def parentThread(): thread_id = 0 thread_id += 1 print ' Creating new thread' thread.start_new(childThread, (thread_id,)) print ' Destroy new thread' if raw_input() == 'q': break print "press 'q' to quit." if __name__ == "__main__": print "Test with", sys.argv[0] parentThread() spawn_thread.py

スレッドの使用例: spawn_thread_exit.py threadを次々と生成する. mutexなし. import sys, time import thread def childThread(thread_id): n = 0 while 1: print ' Hello from thread', thread_id, 'n', n time.sleep(3) n += 1 if n > 5: thread.exit() def parentThread(): thread_id = 0 thread_id += 1 print ' Creating new thread' thread.start_new(childThread, (thread_id,)) print ' Destroy new thread' if raw_input() == 'q': break print "press 'q' to quit." if __name__ == "__main__": print "Test with", sys.argv[0] parentThread() spawn_thread_exit.py

スレッドの使用例: thread_count.py threadを生成して, 自分のidとループindexを表示する. mutexなし. mutexなしなので, あるスレッドのループが完全に終了する前に, 他スレッドのループ出力が表示される可能性がある. import sys, time import thread def childThread(my_id, count): for i in range(0, count): time.sleep(1.0) print ' [my_id = %s] => %s' % (my_id, i) def parentThread(): for my_id in range(0, 10): print 'Create new thread [my_id = %s]' % (my_id,) thread.start_new(childThread, (my_id, 3)) print 'Destroy new thread [my_id = %s]' % (my_id,) if __name__ == "__main__": print "Test with", sys.argv[0] parentThread()

スレッドの使用例: thread_mutex.py threadを生成して, 自分のidとループindexを表示する. mutexあり. ループ開始時にmutexを取得しているので, あるスレッドのループ処理中に, 他スレッドがループ表示をすることがない. import sys import thread, time def childThread(my_id, count): mutex.acquire() for i in range(count): time.sleep(1) print ' [my_id = %s] => %s' % (my_id, i) mutex.release() def parentThread(): global mutex mutex = thread.allocate_lock() for my_id in range(10): print 'Creating new thread[my_id = %s]' % (my_id,) thread.start_new_thread(childThread, (my_id, 3)) print 'Destroy new thread[%s]' % (my_id,) if __name__ == "__main__": print "Test with", sys.argv[0] parentThread()

スレッドの使用例: thread_count_wait.py counter()関数のスレッドを作る. mutexあり. stdout用のmutex. すべてのスレッドが死ぬまで, 手動でブロックする. import sys, time import thread stdout_mutex = thread.allocate_lock() exit_mutexes = [0] * 10 def childThread(my_id, count): global exit_mutexes for i in range(count): stdout_mutex.acquire() print ' [my_id = %s] => %s' % (my_id, i) stdout_mutex.release() exit_mutexes[my_id] = 1 def parentThread(): for i in range(10): print 'Create new thread [my_id = %s]' % (my_id,) thread.start_new(counter, (i, 100)) print 'Destroy new thread [my_id = %s]' % (my_id,) while 0 in exit_mutexes: pass if __name__ == "__main__": print "Test with", sys.argv[0] parentThread()