開発環境
- 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 コメント:
コメントを投稿