Предназначен для блокировки процессов в «кластере» с использованием пакета parallel
. Например:
mclapply(1:10,
function(v){
l1 = lock("lock.txt")
v*2
Sys.sleep(1)
unlock(l1)
return(v*2)},
mc.cores=8)
потребуется около 10 секунд для запуска, потому что каждая итерация должна ждать, пока не получит блокировку файла, и она будет заблокирована в течение 1 секунды сна, а другой процесс ожидает. Если вместо этого я делаю:
mclapply(1:10,
function(v){
l1 = lock("lock.txt")
v*2
unlock(l1)
Sys.sleep(1)
return(v*2)},
mc.cores=8)
, когда блокировка составляет перед сном, затем она запускается примерно через 1 секунду, поскольку большую часть времени процессы могут свободно выполняться.
Итак, используйте lock
внутри parallel
выполненных деталей, чтобы обеспечить эксклюзивный доступ к общему ресурсу. Я не уверен, что это имеет смысл внутри одного потока кода R. Один поток всегда сможет получить блокировку файла. Семантика "is.locked.by.this.process", поэтому вы получаете TRUE во второй раз. Хотя я не уверен, что это объясняет поведение is.locked
, но я не уверен, что проверять, заблокировано ли что-то, - хорошая практика, в любом случае - либо получить блокировку и продолжить, либо разблокировать удерживаемую блокировку ...