powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Почему скрипты не выполняются параллельно?
18 сообщений из 18, страница 1 из 1
Почему скрипты не выполняются параллельно?
    #39895545
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую уважаемых коллег. Пожалуйста помогите решить такую проблему.

Через bash пытаюсь запустить несколько php скриптов в фоновом режиме одновременно. Скрипт примерно такой:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
aa=(
	115116 
	173909 
	179148 
	200341
)
for i in ${!aa[@]}; do
    #echo $i ----------- ${aa[$i]}
    php ./OrderInfoSync_common.php ${aa[$i]} > /dev/null &
done


По своим логам вижу, что выполняется только один поток (необязательно первый, но первый чаще всего).
Если убрать амперсанд в конце команды, то все скрипты выполняются по порядку последовательно.
Но почему я не могу запустить в фоне их все одновременно?
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39895684
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно, что-то внутри скрипта не дает работать остальным экземплярам. Навскидку, например, session_start() в PHP ожидает освобождения сессии. Простой же тест показывает, что работают все экземпляры.

Скрипты:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$ cat test.sh
#!/bin/bash

aa=(
    115116
    173909
    179148
    200341
)
for i in ${!aa[@]}; do
    echo $i ----------- ${aa[$i]}
    php ./test.php ${aa[$i]} > /dev/null &
done


Код: sql
1.
2.
3.
$ cat test.php 
<?php
sleep(120);


Запуск
Код: sql
1.
2.
3.
4.
5.
$ ./test.sh 
0 ----------- 115116
1 ----------- 173909
2 ----------- 179148
3 ----------- 200341


Смотрим:
Код: sql
1.
2.
3.
4.
5.
$ ps -ax | grep test.php
21905 pts/11   S      0:00 php ./test.php 115116
21906 pts/11   S      0:00 php ./test.php 173909
21907 pts/11   S      0:00 php ./test.php 179148
21908 pts/11   S      0:00 php ./test.php 200341
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39895714
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle
Вероятно, что-то внутри скрипта не дает работать остальным экземплярам. Навскидку, например, session_start() в PHP ожидает освобождения сессии.

одновременное обращение к mysql через PDO может быть причиной?
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39895906
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
одновременное обращение к mysql через PDO может быть причиной?

Не сам PDO, конечно, есть причина. В разных скриптах создаются разные объекты PDO, да и сессии в MySQL они открывают разные. Вряд ли какая-то связь меж ними на уровне PDO возможна.
Причиной может стать блокировка (в том числе и неявная) таблиц в сессии MySQL от запросов первого скрипта. Запросы из второго и последующих экземпляров скрипта будут ожидать снятия блокировки коллегами, чтобы установить свою.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896055
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно, спасибо, будем искать причину внутри.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896123
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё вопрос родился:
Можно ли средствами bash ограничить число одновременно запускаемых процессов?
Например, имеется массив из 30 задач, я хочу чтобы они выполнялись параллельно, но при этом одновременно должно быть запущено не более 10 скриптов.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896217
Фотография bga83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
Вот ещё вопрос родился:
Можно ли средствами bash ограничить число одновременно запускаемых процессов?
Например, имеется массив из 30 задач, я хочу чтобы они выполнялись параллельно, но при этом одновременно должно быть запущено не более 10 скриптов.
можно в сторону ulimit посмотреть, но там ограничение на общее число процессов будет, а не конкретных
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896248
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
Например, имеется массив из 30 задач, я хочу чтобы они выполнялись параллельно, но при этом одновременно должно быть запущено не более 10 скриптов.
Делал как то подобное. Только форк новых процессов делал непосредственно в PHP, да и вообще, без bash обошелся. В моем случае ветка кода управления проверяла наличие задач, актуальные лимиты (кажется, ограничение на число запросов к стороннему серверу в единицу времени) и управляла количеством дочерних процессов, форкая новые или оставляя ценные указания (кажется, мемкеш использовал для промежуточного хранения) работающим процессам на необходимость притормозить. Код вряд ли сейчас найду.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896290
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,
Да?! для меня открытие, что в PHP вообще можно форкать. я был уверен, что это сугубо однопоточный язык и максимум что там можно сделать - это запустить внешний скрипт через shell_exec и не ждать его исполнения.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896309
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин,

Одно другому не мешает. Однопоточный и есть. Форкается то процесс. Ну а управление процессами в документации расписано. Тынц . Там же рядом есть и передача сигналов, если что.

Ну в форке тоже есть нюансы. Тот же коннект к СУБД, например. Общим, точнее, форкнутым, его можно сделать и он будет работать. Но! Если этот коннект закроет какой-то один из из экземпляров (например, завершившись), то остальные останутся с... В общем, долго искал, кудау меня коннект делся. В итоге в каждом запущенном экземпляре инициализацию с нуля делал.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896372
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел вот на python практически готовое решение:
Код: python
1.
2.
3.
4.
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor:
	for id in ids:
		executor.submit(doit, id)
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896587
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось самая малость - переписать скрипты на другой яп? ;-)
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896666
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle
Осталось самая малость - переписать скрипты на другой яп? ;-)

зачем?
Мы же легко вызываем из bash скрипт, написанный на php. Также можно делать из python.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896912
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это лишь замена скрипта на bash, а из него пойдет обычный системный вызов для запуска другой программы? Тады да, конечно.
Кстати, удалось выяснить причину блокировки или ожидания в пхпшном скрипте?
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39896991
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle
Кстати, удалось выяснить причину блокировки или ожидания в пхпшном скрипте?

Неа. там говно-коду строк на 500, написанного не мной, поэтому я решил пока туда не лазить. Просто не стал делать параллельное выполнение скриптов, тормозят конечно, но пока терпимо. Когда-нибудь руки дойдут, полезу разбираться там.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39897651
Лебедкин
Нашел вот на python практически готовое решение:
Код: python
1.
2.
3.
4.
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor:
	for id in ids:
		executor.submit(doit, id)



мультипоточность в питоне вроде плохо работает, лучше задействовать мультипроцессорность

The asynchronous execution can be performed with threads, using ThreadPoolExecutor, or separate processes, using ProcessPoolExecutor. Both implement the same interface, which is defined by the abstract Executor class.
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39897654
Фотография bga83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сладкий бубалех
Лебедкин
Нашел вот на python практически готовое решение:
Код: python
1.
2.
3.
4.
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor:
	for id in ids:
		executor.submit(doit, id)




мультипоточность в питоне вроде плохо работает, лучше задействовать мультипроцессорность

The asynchronous execution can be performed with threads, using ThreadPoolExecutor, or separate processes, using ProcessPoolExecutor. Both implement the same interface, which is defined by the abstract Executor class.

только наверное не мультипроцессорность, а мультипроцессность - это все же несколько разные вещи
...
Рейтинг: 0 / 0
Почему скрипты не выполняются параллельно?
    #39898995
Мутаген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лебедкин

Можно ли средствами bash ограничить число одновременно запускаемых процессов?
Например, имеется массив из 30 задач, я хочу чтобы они выполнялись параллельно, но при этом одновременно должно быть запущено не более 10 скриптов.

Если это Linux, то программа xargs умеет что нужно. Ключ -P <x> запускает не более x параллельных процессов за раз, -n <x> передаёт не более x аргументов процессов.

Код: plaintext
echo 115116 173909 179148 200341 | xargs -P 2 -n 1 php ./test.php

запустит два test.php параллельно с аргументами 115116 173909 каждому и затем ещё два с оставшимися цифрами

На больших Unix для такого функционала надо использовать xargs из GNU coreutils
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Почему скрипты не выполняются параллельно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]