Можно также сделать это с помощью pylab и xticks
import pylab as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()
http://matplotlib.org/examples/ticks_and_spines /ticklabels_demo_rotation.html
Если точка блокировки должна препятствовать тому, чтобы несколько процессов пытались заполнить пустой ключ кэша, почему Вы не хотели бы иметь блокирующуюся блокировку?
$value = apc_fetch($KEY);
if ($value === FALSE) {
shm_acquire($SEMAPHORE);
$recheck_value = apc_fetch($KEY);
if ($recheck_value !== FALSE) {
$new_value = expensive_operation();
apc_store($KEY, $new_value);
$value = $new_value;
} else {
$value = $recheck_value;
}
shm_release($SEMAPHORE);
}
, Если кэш хорош, Вы просто прокручиваетесь с ним. Если нет ничего в кэше, Вы получаете блокировку. После того как у Вас есть блокировка, необходимо будет перепроверить кэш, чтобы удостовериться, что, в то время как Вы ожидали для получения блокировки, кэш не был повторно заполнен. Если кэш был повторно заполнен, используйте то значение & выпустите блокировку, иначе, Вы делаете вычисление, заполняете кэш & затем выпустите свою блокировку.
На самом деле проверьте, чтобы видеть, будет ли это работать лучше затем предложение Peter.
использует монопольную блокировку и если Ваше удобное ею, поместите все остальное, что попыталось заблокировать файл в 2-3 вторых снах. При правильной организации Ваш сайт испытает подвешивать относительно заблокированного ресурса, но не орды сценариев, борющихся для кэширования samething.
Если Вы не возражаете основывать свою блокировку на файловой системе, то Вы могли использовать fopen () с режимом 'x'. Вот пример:
$f = fopen("lockFile.txt", 'x');
if($f) {
$me = getmypid();
$now = date('Y-m-d H:i:s');
fwrite($f, "Locked by $me at $now\n");
fclose($f);
doStuffInLock();
unlink("lockFile.txt"); // unlock
}
else {
echo "File is locked: " . file_get_contents("lockFile.txt");
exit;
}
См. www.php.net/fopen
То, что я нашел, на самом деле, то, что мне не нужна никакая блокировка, вообще... данная, что я пытаюсь создать, карта всего класса => ассоциации пути для автозагрузки, не имеет значения, если один процесс перезаписывает то, что другой нашел (это очень маловероятно, если кодировано правильно), потому что данные доберутся там в конечном счете так или иначе. Так, решение не оказалось "никакими блокировками".
Я понимаю, что этому уже год, но я просто наткнулся на вопрос, когда сам проводил некоторые исследования по блокировке в PHP.
Мне пришло в голову, что решение возможно с использованием самого APC. Называйте меня сумасшедшим, но это может быть работающий подход:
function acquire_lock($key, $expire=60) {
if (is_locked($key)) {
return null;
}
return apc_store($key, true, $expire);
}
function release_lock($key) {
if (!is_locked($key)) {
return null;
}
return apc_delete($key);
}
function is_locked($key) {
return apc_fetch($key);
}
// example use
if (acquire_lock("foo")) {
do_something_that_requires_a_lock();
release_lock("foo");
}
На практике я могу бросить туда другую функцию, чтобы сгенерировать ключ для использования здесь, просто чтобы предотвратить столкновение с существующим ключом APC, например:
function key_for_lock($str) {
return md5($str."locked");
}
Параметр $expire
является хорошей возможностью для использования APC, так как он предотвращает сохранение блокировки навсегда, если ваш скрипт умирает или что-то в этом роде.
Надеюсь, что этот ответ будет полезен всем, кто наткнется на него через год.