Мне нужен параллельный task runner в PHP (скорее всего, на windows – IIS7 fastcgi), который скрывает полную реализацию. Его интерфейс должен быть примерно таким:
$taskRunner = new ParallelTaskRunner(); $taskRunner->add(function () use ($sharedResource){ //task 1 }); $taskRunner->add(function () use ($sharedResource){ //task 2 }); $taskRunner->run(); //runs task 1, task 2 parallel
Я провел некоторое исследование: я знаю методы, с помощью которых я могу запускать PHP-код параллельно – pthreads, pcntl, exec, gearman, curl multi и т. Д.
На вопросы, на которые мне нужно ответить:
task1: { a(); b(); }
task1: { a(); b(); }
task1: { a(); b(); }
, task2: { c(); }
task2: { c(); }
, как я могу узнать, что вызывающий порядок функций был a(); b(); c();
a(); b(); c();
или a(); c(); b();
a(); c(); b();
или c(); a(); b();
c(); a(); b();
? Обновить
Я проверил много возможных решений, и я закончил с pthreads. Гораздо проще использовать потоки, чем процессы … Единственный недостаток, который не поддерживает xdebug.
Что-то я написал, но не успел поговорить о …
Обещания восхитительны, они делают что-то обычно довольно сложным во что-то очень простое.
Каждый понимает концепцию стека, когда мы говорим о Javascript; это то, как выполняются анимации и множество других причудливых вещей, которые мы делаем в Интернете.
По сути, мои попытки написать обещания для pthreads – попытка сделать потоки простыми, как стек Javascript, который все понимают.
Просто так случается, что эта вещь идеально подходит для ваших потребностей:
$manager = new PromiseManager(); $promise = new Promise($manager, new CalculateTheMeaningOfLife()); $promise ->then( new AddTwo($promise)) ->then( new PrintMeaning($promise)); $manager->shutdown();
Вам нужно использовать объекты, а не закрывать (ограничение Zend), но это шаблон обещаний, и он полностью асинхронный и управляемый.
Это PHP, поэтому его можно установить вместе с композитором … если вам нравится такая штука …