排他処理デコレータ
ついでに排他処理やってくれるデコレータも作った。
てか検索すると同じようなデコレータの例がたくさん。
Synchronized.py
# -*- coding:utf-8 -*- from threading import Lock lock = Lock() def Synchronized(): def decorator(srcfunc): def dstfunc(*args, **kwargs): lock.acquire() try: return srcfunc(*args, **kwargs) finally: lock.release() return dstfunc return decorator
test.py
# -*- coding:utf-8 -*- from threading import Thread from Synchronized import Synchronized import time class threadtest(Thread): def __init__(self,name): Thread.__init__(self) self.setDaemon(True) self.name = name self.n = 1 def run(self): while True: self.Pause() print self.name,self.n time.sleep(1) self.n += 1 @Synchronized() def Pause(self): if self.n % 5 == 0: for i in xrange(3): time.sleep(1) print self.name, "PAUSE" if __name__ == '__main__': a = threadtest("test1") a.start() time.sleep(2) b = threadtest("test2 ") b.start() time.sleep(15)
実行結果
test1 1 test1 2 test1 3 test2 1 test2 2 test1 4 test1 PAUSE test1 PAUSE test1 PAUSE test1 5 test2 3 test1 6 test2 4 test1 7 test2 PAUSE test2 PAUSE test2 PAUSE test2 5 test1 8 test1 9 test2 6 test1 PAUSE test1 PAUSE test1 PAUSE test1 10 test2 7
楽だねこれは。