我已使用它们进行同步。
import functools
def synchronized(lock):
""" Synchronization decorator """
def wrap(f):
@functools.wraps(f)
def newFunction(*args, **kw):
lock.acquire()
try:
return f(*args, **kw)
finally:
lock.release()
return newFunction
return wrap
正如评论中指出的那样,从Python 2.5开始,您可以将with
语句与threading.Lock
(或multiprocessing.Lock
从2.6版本开始)对象结合使用, 以将装饰器的实现简化为:
import functools
def synchronized(lock):
""" Synchronization decorator """
def wrap(f):
@functools.wraps(f)
def newFunction(*args, **kw):
with lock:
return f(*args, **kw)
return newFunction
return wrap
无论如何,您都可以这样使用它:
import threading
lock = threading.Lock()
@synchronized(lock)
def do_something():
# etc
@synchronzied(lock)
def do_something_else():
# etc
基本上,它只是将lock.acquire()
/ lock.release()
放在函数调用的任一侧。