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

Тема в разделе "Как сделать...", создана пользователем D@nil, 27 июн 2012.

  1. D@nil

    D@nil

    Регистр.:
    1 окт 2006
    Сообщения:
    338
    Симпатии:
    122
    Здравствуйте.

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

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

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

    Есть counter_get() но какая библиотека нужна чтобы его использовать?
     
  2. SolutionFix

    SolutionFix 17 лет програмлю ;)

    Регистр.:
    20 ноя 2006
    Сообщения:
    272
    Симпатии:
    318
    А просто flock()/fwrite() чего не подходит?
     
  3. D@nil

    D@nil

    Регистр.:
    1 окт 2006
    Сообщения:
    338
    Симпатии:
    122
    Сейчас так и реализовано
    Код:
    while (!@flock ($fp,LOCK_EX)) {
        usleep(100000); //0.1s
    }
    только это не красивое решение, хотя работает :)

    Правильное решение это семафоры для блокирования действий и выстраивания очереди. но их нет под win платформу :(
     
  4. SolutionFix

    SolutionFix 17 лет програмлю ;)

    Регистр.:
    20 ноя 2006
    Сообщения:
    272
    Симпатии:
    318
    Не так.
    flock без флага LOCK_NB сам по себе приостанавливает процесс пока не сможет залочить
    То есть
    PHP:
    flock($fLOCK_EX);
    ...
    flock($fLOCK_UN);
    вполне достаточно.
    Оберни в функцию: залочил, считал позицию, добавил единичку, записал и все дела.
    Поверь опыту, если там меньше чем сотни обращений в секунду так все будет работать стабильно и ничего менять не надо.
     
  5. D@nil

    D@nil

    Регистр.:
    1 окт 2006
    Сообщения:
    338
    Симпатии:
    122
    Получился такой код:
    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;
    }
     
    artcosmic нравится это.