Гость
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Почему скрипты не выполняются параллельно? / 18 сообщений из 18, страница 1 из 1
28.11.2019, 13:13
    #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
28.11.2019, 15:00
    #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
28.11.2019, 15:28
    #39895714
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему скрипты не выполняются параллельно?
vkle
Вероятно, что-то внутри скрипта не дает работать остальным экземплярам. Навскидку, например, session_start() в PHP ожидает освобождения сессии.

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

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

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

Ну в форке тоже есть нюансы. Тот же коннект к СУБД, например. Общим, точнее, форкнутым, его можно сделать и он будет работать. Но! Если этот коннект закроет какой-то один из из экземпляров (например, завершившись), то остальные останутся с... В общем, долго искал, кудау меня коннект делся. В итоге в каждом запущенном экземпляре инициализацию с нуля делал.
...
Рейтинг: 0 / 0
29.11.2019, 13:44
    #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
29.11.2019, 19:44
    #39896587
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему скрипты не выполняются параллельно?
Осталось самая малость - переписать скрипты на другой яп? ;-)
...
Рейтинг: 0 / 0
30.11.2019, 11:07
    #39896666
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему скрипты не выполняются параллельно?
vkle
Осталось самая малость - переписать скрипты на другой яп? ;-)

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

Неа. там говно-коду строк на 500, написанного не мной, поэтому я решил пока туда не лазить. Просто не стал делать параллельное выполнение скриптов, тормозят конечно, но пока терпимо. Когда-нибудь руки дойдут, полезу разбираться там.
...
Рейтинг: 0 / 0
03.12.2019, 16:22
    #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
03.12.2019, 16:30
    #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
06.12.2019, 11:28
    #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
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Почему скрипты не выполняются параллельно? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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