def once_per_command(func=None, block=False, default=None):
if func is None:
return functools.partial(once_per_command, block=block, default=default)
@functools.wraps(func)
def _func(*args, **kwargs):
lock = last_hash.get_lock()
if lock.acquire(block):
try:
command = fab.env.command or ''
infrastructure = fab.env.infrastructure or ''
current_session = hashlib.md5()
current_session.update(command.encode('utf-16be'))
current_session.update(infrastructure.encode('utf-16be'))
for host in fab.env.all_hosts:
current_session.update(host.encode('utf-16be'))
current_hash = current_session.digest()
if current_hash != last_hash.raw:
last_hash.raw = current_hash
return func(*args, **kwargs)
return default
finally:
lock.release()
last_hash = multiprocessing.Array(ctypes.c_char, hashlib.md5().digest_size)
return _func
评论列表
文章目录