開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Python 3.4 (プログラミング言語)
Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の12章(スレッド: 並列の世界)、長いエクササイズ(p.516)をpythonで考えてみる。
長いエクササイズ(p.516)
コード(BBEdit, Emacs)
sample516_a.py
#!/usr/bin/env python3 #-*- coding: utf-8 -*- # バージョンA import threading beers = 2000000 lock = threading.Lock() def drinkLots(): global beers lock.acquire() for x in range(100000): beers -= 1 lock.release() print('beers = {0}'.format(beers)) threads = [threading.Thread(target=drinkLots) for x in range(20)] print('壁にはビールが{0}本\n{0}本のビール'.format( beers)) for thread in threads: thread.start() for thread in threads: thread.join() print('現在、壁にはビールが{0}本あります。'.format(beers))
sample516_b.py
#!/usr/bin/env python3 #-*- coding: utf-8 -*- # バージョンB import threading beers = 2000000 lock = threading.Lock() def drinkLots(): global beers for x in range(100000): lock.acquire() beers -= 1 lock.release() print('beers = {0}'.format(beers)) threads = [threading.Thread(target=drinkLots) for x in range(20)] print('壁にはビールが{0}本\n{0}本のビール'.format( beers)) for thread in threads: thread.start() for thread in threads: thread.join() print('現在、壁にはビールが{0}本あります。'.format(beers))
入出力結果(Terminal, IPython)
$ ./sample516_a.py 壁にはビールが2000000本 2000000本のビール beers = 1900000 beers = 1800000 beers = 1700000 beers = 1600000 beers = 1500000 beers = 1400000 beers = 1300000 beers = 1200000 beers = 1100000 beers = 1000000 beers = 900000 beers = 800000 beers = 700000 beers = 600000 beers = 500000 beers = 400000 beers = 300000 beers = 200000 beers = 100000 beers = 0 現在、壁にはビールが0本あります。 $ ./sample516_b.py 壁にはビールが2000000本 2000000本のビール beers = 428286 beers = 427811 beers = 297826 beers = 294105 beers = 282050 beers = 230187 beers = 220946 beers = 219168 beers = 131469 beers = 119848 beers = 77570 beers = 39012 beers = 32363 beers = 26561 beers = 17282 beers = 8357 beers = 7972 beers = 4038 beers = 3471 beers = 0 現在、壁にはビールが0本あります。 $
0 コメント:
コメントを投稿