1

Тема: Багатопоточність в циклі

Доброго вечора. Ніколи не думав про багатопоточність бо не було такої потреби раніше. Зараз стикнувся з проблемою у часі виконання певного циклу.
Є масив, що включає в себе перелік певних методів у різних класах. За своїм принципом всі ці методи несуть одну і ту ж дію, але містять різні дані. В циклі foreach я викликаю ці методи передаючи в них певний набір даних (він завжди різний), а вони в свою чергу роблять curl запит на віддалені сервіси API. Потім я в цих же методах привожу все до єдиного вигляду і запаковую в асоціативний масив і вивожу далі. Працювало все чудово до поки таких віддалених запитів було 20-30. А коли їх стало біля 100 то час проходу став значно більшим і це доставляє певний дискомфорт.
Перечитав про багатопоточність curl, але це не те рішення, що може допомогти. Чи є взагалі варіанти які б дозволили паралельно виконовувати інтерації циклу не чекаючи завершення попередньої ітерації?

2

Re: Багатопоточність в циклі

Вже давно не працював з РНР тому можу помилятися, але здається в РНР є pthreads через який можна організувати багато-потоковість
https://www.php.net/manual/en/book.pthreads.php - Документація

https://www.sitepoint.com/parallel-prog … damentals/ - Приклад

class Task extends Threaded
{
    private $value;

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

    public function run()
    {
        usleep(250000);
        echo "Task: {$this->value}\n";
    }
}

$pool = new Pool(4);

for ($i = 0; $i < 15; ++$i) {
    $pool->submit(new Task($i));
}

while ($pool->collect());

$pool->shutdown();
Подякували: leofun011

3

Re: Багатопоточність в циклі

Intrerio написав:

Доброго вечора. Ніколи не думав про багатопоточність бо не було такої потреби раніше. Зараз стикнувся з проблемою у часі виконання певного циклу.
Є масив, що включає в себе перелік певних методів у різних класах. За своїм принципом всі ці методи несуть одну і ту ж дію, але містять різні дані. В циклі foreach я викликаю ці методи передаючи в них певний набір даних (він завжди різний), а вони в свою чергу роблять curl запит на віддалені сервіси API. Потім я в цих же методах привожу все до єдиного вигляду і запаковую в асоціативний масив і вивожу далі. Працювало все чудово до поки таких віддалених запитів було 20-30. А коли їх стало біля 100 то час проходу став значно більшим і це доставляє певний дискомфорт.
Перечитав про багатопоточність curl, але це не те рішення, що може допомогти. Чи є взагалі варіанти які б дозволили паралельно виконовувати інтерації циклу не чекаючи завершення попередньої ітерації?

Так самі не бачите з свого опису що подібна задача багатопоточна?
Цеж Вам не статична сторінка з лінками кудись там .. , і досвідос.

4

Re: Багатопоточність в циклі

Betterthanyou написав:

Вже давно не працював з РНР тому можу помилятися, але здається в РНР є pthreads через який можна організувати багато-потоковість
https://www.php.net/manual/en/book.pthreads.php - Документація

https://www.sitepoint.com/parallel-prog … damentals/ - Приклад

class Task extends Threaded
{
    private $value;

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

    public function run()
    {
        usleep(250000);
        echo "Task: {$this->value}\n";
    }
}

$pool = new Pool(4);

for ($i = 0; $i < 15; ++$i) {
    $pool->submit(new Task($i));
}

while ($pool->collect());

$pool->shutdown();

Як варіант. Зараз спробую

5

Re: Багатопоточність в циклі

Droid 77 написав:
Intrerio написав:

Доброго вечора. Ніколи не думав про багатопоточність бо не було такої потреби раніше. Зараз стикнувся з проблемою у часі виконання певного циклу.
Є масив, що включає в себе перелік певних методів у різних класах. За своїм принципом всі ці методи несуть одну і ту ж дію, але містять різні дані. В циклі foreach я викликаю ці методи передаючи в них певний набір даних (він завжди різний), а вони в свою чергу роблять curl запит на віддалені сервіси API. Потім я в цих же методах привожу все до єдиного вигляду і запаковую в асоціативний масив і вивожу далі. Працювало все чудово до поки таких віддалених запитів було 20-30. А коли їх стало біля 100 то час проходу став значно більшим і це доставляє певний дискомфорт.
Перечитав про багатопоточність curl, але це не те рішення, що може допомогти. Чи є взагалі варіанти які б дозволили паралельно виконовувати інтерації циклу не чекаючи завершення попередньої ітерації?

Так самі не бачите з свого опису що подібна задача багатопоточна?
Цеж Вам не статична сторінка з лінками кудись там .. , і досвідос.

Ви серйозно? Ви вважаєте багатопоточністю динаміку? А статичну сторінку з набором css стилів та html не багатопоточністю?

Давайте я спочатку поясню принцип будь-якого циклу в PHP foreach, for чи while. Кожна ітерація (коло проходу циклу) виконується по факту завершення попереднього. Наприклад:

for($i = 0; $i < 5; $i++) {
    echo $i;
}

Тобто цикл виконуватиметься до поки 5 більше $i. Але в даному випадку кожна наступна ітерація $i++ не може бути виконана, поки не завершена попередня. Це дуже примітивний приклад і якщо замінити echo $i на щось типу Class::Method то наступна ітерація не почнеться поки не буде виконано Class::Method. А мені потрібно асинхронно виконати Class::Method не чекаючи завершення попереднього.

6

Re: Багатопоточність в циклі

Я б не обробляв все в циклі, рано чи пізно буде не сотні, а тисячі запитів, якісь ресурси підвисатимуть, і скрипт просто вилітатиме по таймауту. Краще організувати чергу і виконувати скрипт у фоновому режимі, викликаючи за розкладом.