PHP pthreads, в задачах пула, ob_flush и flush вызывают сбой

1
    $p = new Pool(10);

    for ($i = 0; i<1000; i++){
        $tasks[i] = new workerThread($i);
    }

    foreach ($tasks as $task) {
        $p->submit($task);
    }

    // shutdown will wait for current queue to be completed
    $p->shutdown();
    // garbage collection check / read results
    $p->collect(function($checkingTask){
        return ($checkingTask->isGarbage);
    });


class workerThread extends Collectable {

    public function __construct($i){
        $this->i= $i;
    }

    public function run(){
        echo $this->i;
        ob_flush();
        flush();
    }
}

Вышеприведенный код является простым примером, который может привести к сбою. Я пытаюсь обновить страницу в реальном времени, поставив ob_flush() и flush(); в Threaded Object, и он работает в основном так, как ожидалось. Таким образом, код, указанный выше, не гарантируется сбой каждый раз, но если вы запустите его в несколько раз больше, иногда сценарий останавливается и Apache перезапускается с сообщением об ошибке "httpd.exe Ошибка приложения. Команда на" 0x006fb17f "ссылается на память на" 0x028a1e20 "Память не может быть" Написана ". Нажмите" ОК ".

Я думаю, что это вызвано размыванием конфликта нескольких потоков, когда они пытаются свернуть примерно в одно и то же время? Что я могу сделать, чтобы обойти его и очистить, так как есть новый выход.

Теги:
pthreads
threadpool
flush

1 ответ

2
Лучший ответ

Несколько потоков не должны записывать стандартный вывод, нет безопасного способа сделать это.

Zend не предоставляет возможности для обеспечения безопасности, он работает по совпадению и всегда будет небезопасным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню