Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 13.10.2016 11:48:53

Pthreads, Laravel Commands и Closure. Помогите найти решение

Добрый день, товарищи.

Есть необходимость выполнить определённый процесс в несколько потоков. Открыл для себя расширение для php - pthreads.
На примере простого скрипта вне Laravel всё работает замечательно и мне очень понравились результаты. Решил перенести в Laravel и столкнулся с проблемой. Конечно же я поискал в сети, отыскал несколько вопросов на stackoverflow, где отвечал сам автор расширения. Но мне не помогли его ответы, потому я прошу вас помочь мне.

Вопрос с ответом автора расширения.

Есть класс App\Commands\QuestionsParserCommand. Внутри я создаю экземпляр класса App\My\Questions\QuestionsParser и вызываю метод init. Дальше код метода init():

// Создадим пул
$pool = new Pool($this->threads, ParserWorkers::class);

// Создадим класс потока
$thread = new class extends Threaded
{
  public function run()
  {
    // Класс будет получать определённые данные из некого провайдера, который будет распределяться между потоками через ParserWorkers
    // Работать с API и сохранять данные в БД.
    // Необходима работа с потоками, ибо данных для обработки невероятно много

    echo '+';
  }
};

// Запустим потоки
for ($i = 0; $i < $this->threads; $i++) {
  $pool->submit($thread);
}

$pool->shutdown();

Класс ParserWorkers наследуется от Worker и пока имеет пустой метод run().

В итоге я запускаю сценарий и получаю в логах сообщение:
[13-Oct-2016 11:27:35 Europe/Moscow] PHP Fatal error:  Uncaught Exception: Serialization of 'Closure' is not allowed in [no active file]:0
Stack trace:
#0 {main}
  thrown in [no active file] on line 0

Сведения:
Laravel 5.2.43, php 7.0.8, Windows

Изменено Nik_Gubin (13.10.2016 11:52:51)

Не в сети

#2 13.10.2016 11:55:00

Re: Pthreads, Laravel Commands и Closure. Помогите найти решение

Изобретаешь велик.

В ларе есть механизмы консольных команд, очередей и механизм шедулера.

Дёргай ИЗВНЕ шедулет, дёргающий очереди АСИНХРОННО, которые работают с командной строкой.

И будет тебе параллельное исполнение кода.

Если нужно взаимодействие между такими "потоками", то в принципе тоже не большая проблема создать посредника, который будет читаем и записываем, например БД.

Не в сети

#3 13.10.2016 12:09:40

Re: Pthreads, Laravel Commands и Closure. Помогите найти решение

Я знал, что получу такой ответ. Ничего нового.
А что вы можете предложить с решением вопроса?

Мне не подходит реализация этой задачи на очередях.

Не в сети

#4 13.10.2016 14:09:06

Re: Pthreads, Laravel Commands и Closure. Помогите найти решение

пиши свой фреймворк для исполнения работы и реализуй на базе сервера очередей Gearman. Обязательно посмотри и почитай про него, я на нём подобное реализовывал. А со сторонв РНР я тупо форкал процессы, а не делил на потоки. Язык в принципе линейный, потоки и форки это от лукавого...

Не в сети

#5 05.12.2016 18:21:09

Евгений

Re: Pthreads, Laravel Commands и Closure. Помогите найти решение

Laravel + Redis + Node.js
Нода хорошо работает с асинхронным кодом. ну аесли тебе результаты парссинга надо заносить в бд, то можно обойтись и без laravel.

#6 06.12.2016 01:39:18

Re: Pthreads, Laravel Commands и Closure. Помогите найти решение

Плюсую к @hzone. Адекватно на PHP, с использованием существующих пакетов, мультипоточность сделать не получится. Слишком не приспособлены они.

Возможно тебе стоит воспользоваться ещё какими нибудь языками программирования.

Не в сети

Подвал раздела