居眠り床屋の間違い

@chobieさんに教えてもらった問題

「居眠り床屋問題」やってみました。

http://ja.doukaku.org/285/

以下コード


#!/usr/bin/env python
# fileencoding:utf-8

import sys, time
import threading, Queue
import random

chairs = [None, None, None]
status = 0

class child_thread(threading.Thread):
status = 0
def __init__(self):
self.status = 0
threading.Thread.__init__(self)
self.start()
def run(self):
global status
status = 2
cnt = 0
time.sleep(random.uniform(100, 400) / 1000)

class parent_thread(threading.Thread):
full = 0
def __init__(self):
#self.sleep()
threading.Thread.__init__(self)
cnt = 0
print("[ "+ self.getName() +" ]\t来店")
if self.getStatus() == 0:
self.wakeup()
print("[ "+ self.getName() +" ]\t床屋、起きる")
for i in xrange(0, 3):
if chairs[i] is None:
chairs[i] = child_thread()
print("%s\tstack queue!!" % i)
break
else:
cnt += 1
self.full = cnt
if cnt == 3:
print("[ "+ self.getName() +" ]\t満席で立ち去る")
# 起きました
def wakeup(self):
global status
status = 1
# 居眠り中
def sleep(self):
global status
status = 0
# 散髪中
def cutting(self):
global status
status = 2

def getStatus(self):
global status
return status

def run(self):
global chairs, status
if self.full == 3:
return None
cnt = 0
for i in xrange(0,3):
if chairs[i] is not None:
if cnt == 0 and self.full != 3:
print("[ "+ self.getName() +" ]\t散髪開始")
#if self.getStatus() == 1:
chairs[i].join()
if chairs[i] is not None:
print("[ "+ chairs[i].getName() +" ]\t散髪完了")
chairs[i] = None
cnt += 1
if chairs.count(None) == 3 and self.getStatus() == 1 or 2:
self.sleep()
print("[ "+ self.getName() +" ]\t床屋、眠る")

class Main:
def execute(*args):
p = parent_thread()
p.start()
while p.isAlive() is True:
return None
p.join()

if __name__ == "__main__":
for i in xrange(1,17):
if i % 9 == 0: time.sleep(1.2)
Main().execute()
time.sleep(random.uniform(0, 200) / 1000)

実行結果


[ Thread-1 ] 来店
[ Thread-1 ] 床屋、起きる
0 stack queue!!
[ Thread-1 ] 散髪開始
[ Thread-3 ] 来店
1 stack queue!!
[ Thread-3 ] 散髪開始
[ Thread-5 ] 来店
2 stack queue!!
[ Thread-7 ] 来店
[ Thread-7 ] 満席で立ち去る
[ Thread-5 ] 散髪開始
[ Thread-8 ] 来店
[ Thread-8 ] 満席で立ち去る
[ Thread-9 ] 来店
[ Thread-9 ] 満席で立ち去る
[ Thread-2 ] 散髪完了
[ Thread-10 ] 来店
0 stack queue!!
[ Thread-12 ] 来店
[ Thread-12 ] 満席で立ち去る
[ Thread-10 ] 散髪開始
[ Thread-11 ] 散髪完了
[ Thread-4 ] 散髪完了
[ Thread-6 ] 散髪完了
[ Thread-1 ] 床屋、眠る
[ Thread-10 ] 床屋、眠る
[ Thread-5 ] 床屋、眠る
[ Thread-3 ] 床屋、眠る
[ Thread-13 ] 来店
[ Thread-13 ] 床屋、起きる
0 stack queue!!
[ Thread-13 ] 散髪開始
[ Thread-15 ] 来店
1 stack queue!!
[ Thread-15 ] 散髪開始
[ Thread-17 ] 来店
2 stack queue!!
[ Thread-17 ] 散髪開始
[ Thread-19 ] 来店
[ Thread-19 ] 満席で立ち去る
[ Thread-20 ] 来店
[ Thread-20 ] 満席で立ち去る
[ Thread-21 ] 来店
[ Thread-21 ] 満席で立ち去る
[ Thread-22 ] 来店
[ Thread-22 ] 満席で立ち去る
[ Thread-14 ] 散髪完了
[ Thread-16 ] 散髪完了
[ Thread-18 ] 散髪完了
[ Thread-17 ] 床屋、眠る
[ Thread-15 ] 床屋、眠る
[ Thread-13 ] 床屋、眠る
[ Thread-23 ] 来店
[ Thread-23 ] 床屋、起きる
0 stack queue!!
[ Thread-23 ] 散髪開始
[ Thread-24 ] 散髪完了
[ Thread-23 ] 床屋、眠る


設計間違えてマルチスレッド床屋書いてしもうた・・・

でもでもでも

child_thread.run()の中身書き換えて重い処理にして

>/dev/null 2>&1 &してtopしたら

ちゃんとCPUごとに処理が割り振られてて感動!!




直したらまたアップします。。。

http://d.hatena.ne.jp/chobie/20091127