Многопоточная работа, счетчики

D@nil

Постоялец
Регистрация
1 Окт 2006
Сообщения
340
Реакции
122
Здравствуйте.

Подскажите как можно организовать счетчик (1,2,3,4) для работы php в несколько потоков (100 процессов php.exe). Среда работы Windows.

Шаред мемори пробовал но без семафоров (нужно под windows) случаются моменты когда несколько потоков берут одно и тоже число. (не успевает увеличить счетчик)

Подскажите кто какие решения использует?

Есть Для просмотра ссылки Войди или Зарегистрируйся но какая библиотека нужна чтобы его использовать?
 
А просто flock()/fwrite() чего не подходит?
 
Сейчас так и реализовано
Код:
while (!@flock ($fp,LOCK_EX)) {
    usleep(100000); //0.1s
}
только это не красивое решение, хотя работает :)

Правильное решение это семафоры для блокирования действий и выстраивания очереди. но их нет под win платформу :(
 
Не так.
flock без флага LOCK_NB сам по себе приостанавливает процесс пока не сможет залочить
То есть
PHP:
flock($f, LOCK_EX);
...
flock($f, LOCK_UN);
вполне достаточно.
Оберни в функцию: залочил, считал позицию, добавил единичку, записал и все дела.
Поверь опыту, если там меньше чем сотни обращений в секунду так все будет работать стабильно и ничего менять не надо.
 
Получился такой код:
PHP:
function getN(){
    $fp = fopen ('n.txt',"a+");
 
    flock($fp,LOCK_EX);
 
    $N = (int)fgets($fp);
    ftruncate ($fp,0);
    fputs($fp ,++$N);
    fflush ($fp);
    flock ($fp,LOCK_UN);
    fclose ($fp);
 
    return --$N;
}
 
Назад
Сверху