[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: pthreads и защищённые методы исполняемых классов
AlmazDelDiablo
Привет всем.

Возник такой вопрос: при передаче в Stackable::run (запускаемого из Thread::run) некоего объекта, который по мере исполнения в потоке вызывает какой-нибудь protected метод своего родителя, я получаю fatal error:
Fatal error: Call to protected method SomeClass::_save() from context 'AbstracOfSomeClasst' in ...
Может, кто-нибудь сталкивался с такой проблемой? Реально ли вообще использовать protected методы в объектах, которые исполняются в потоках? Или же придётся для поточного исполнения городить отдельные сущности, полностью работающие на public?

_____________
Блог | VK | GitHub | Twitch
linker
Я не очень понял, но protected методы можно вызывать только через $this->protectedMethodName()

_____________
Gear Framework
Gear Framework на Github
AlmazDelDiablo
Я понимаю. Эта ошибка вылезает на вызов $this->_save() из AbstractOfSomeClass.

_____________
Блог | VK | GitHub | Twitch
linker
Да простят меня боги, переопределить родительский
protected function _save() { parent::_save(); }


_____________
Gear Framework
Gear Framework на Github
linker
Что-то у тебя там однозначно не так, гадать на кофейной гуще не вижу смысла.

_____________
Gear Framework
Gear Framework на Github
AlmazDelDiablo
Ну, если вызывать всю эту вакханалию в основном потоке, то всё окей, всё отлично работает. Проблема именно в вызове из дополнительного потока:

$threads = [];

foreach($this->getSomeClasses()->getIterator() as $someClass)
{
//$someClass->save(); // такой вызов проходит отлично, protected _save() внутри public save() вызывается успешно.

$threads[] = $thread = new MyThread(new RunnableMagic($someClass, 'save'));
$thread->start(); // а вот здесь вот — fatal error
}

$thread = null;

foreach($threads as $thread)
{
$thread->join();
}


_____________
Блог | VK | GitHub | Twitch
linker
Я, конечно, не общался с pthreads, а что это?
new MyThread(new RunnableMagic($someClass, 'save'));


_____________
Gear Framework
Gear Framework на Github
AlmazDelDiablo
Это Stackable объект, запускаемый в потоке.

Разобрался, кажется, в чём суть. Судя по всему, pthreads криво передавал контекст в поток, и подключённый абстрактный класс в нём отсутствовал. Развернув в потоке лоадер классов, все проблемы решились.

Плюс, решилась проблема с тем, что после отработки потоков, умирал главный поток (судя по всему, сборщик мусора PHP считал мусором главный поток и уничтожал его). Я отключил передачу контекста в потоки и стал вызывать все нужные классы руками.

_____________
Блог | VK | GitHub | Twitch
bestxp
задамся вопросом у тебя какая версия php
и ты через pcntl_fork ? многопоточность делал или ?
killer8080
Цитата (bestxp @ 10.02.2014 - 14:48)
и ты через pcntl_fork ? многопоточность делал или ?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.