Добавил возможность запускать одновременно несколько экземпляров Python.
В НЕ блокирующем режиме выполнения Python скриптов дает возможность одновременно выполнять различные задачи.
Для взаимодействия с Кибор можно использовать какое либо сообщение, которое каждый экземпляр Python отправит по завершению своей задачи.
Применение:
Хорошо подходит к примеру для многопроцессорного, параллельного парсинга различных сайтов и других задач, которые мало зависимы друг от друга.
В многопроцессорном режиме одноименные переменные Python являются уникальными для каждого процесса и невидимы в других.
Обмен данными между процессами можно легко организовать через Кибор.
Для запуска отдельного процесса Python используется та же функция
runpython
В виде единственного параметра надо передать константу ARRAY
Значение данной константы = -1
Данный код запустит три процесса Python
Цитата: runpython(ARRAY);
runpython(ARRAY);
runpython(ARRAY);
При вызове runpython с параметром ARRAY, она возвращает количество запущенных Python.
При первом вызове вернет 1, при втором 2 и так далее.
=========================================
Для одновременного использования множества запущенных процессов Python необходимо выполнять в них скрипт в НЕ блокирующем режиме.
Не блокирующий режим программируется с помощью функций
sendpython
getpython
и директив
__python
#скрипт Python
__end_python
Подробнее о этих функциях - Выполнение скриптов Python в Кибор
Но никто не мешает использовать Блокирующие функции и директивы
sendgetpython
__python_sync
__end_python
Но в этом случае Кибор будет ждать пока этот экземпляр Python не закончит работу со скриптом.
==========================================
Для выбора номера экземпляра Python, к которому относится передаваемые команды используется функция
selectpython(0);
В виде параметра принимает номер запущенного экземпляра Python. Начиная с 0.
Если указать selectpython(); без параметра, будет переключение на основной Python (если он был запущен с помощью функции runpython();
Использовать selectpython(0); selectpython(1); и т.д. можно для директив
__python
__end_python
__python_sync
__end_python
и функций
sendpython
getpython
sendpython
Для переключения между экземплярами Python.
Вызвать функцию selectpython с номером экземпляра Python достаточно один раз.
Все команды будут идти этому экземпляру, пока не вызовется selectpython с другим номером.
Кроме этого для функций
sendpython
getpython
sendpython
можно не использовать переключение с помощью selectpython, если номер экземпляра Python указать в них последним, не обязательным параметром.
при указание этого параметра эти функции будут игнорировать на какой номер переключен selectpython и отсылать команду экземпляру, номер которого указан этим параметром.
Пример стандартного вызова этих функций:
CODE:sendpython("print(^'yes^')");
getpython();
sendgetpython("print(^'yes^')");
Пример указания последнего, не обязательного параметра для выбора номера экземпляра Python:
CODE:sendpython("print(^'yes^')", 1);
getpython(1);
sendgetpython("print(^'yes^')", 1);
Так же можно не указывать номер в функциях, а переключаться так:
CODE:selectpython(1);
sendpython("print(^'yes^')");
getpython();
sendgetpython("print(^'yes^')");
selectpython(2);
sendpython("print(^'yes^')");
getpython();
sendgetpython("print(^'yes^')");
==============================================================
Для использования директив
__python
__end_python
и
__python_sync
__end_python
Переключение с помощью selectpython обязательно для выбора экземпляра Python.
================================================================
closepython закрывает ВСЕ запущенные процессы Python
Пример использования:
не забудьте установить пробелы
Запуск 20 процессов, каждый из которых выполняет свою часть работы.
Много процессорный режим (Отобразить) Цитата: enableconsolepython(1, 1, 50, 50, 800, 200);
int Kol_Process=20;
//Запускаем процессы Python
for (int n=0; n<Kol_Process; n++)
{
if (runpython(ARRAY)<1){messagebox ("Не удалось запустить Python"); goto er;}
}
for (n=0; n<Kol_Process; n++)
{
selectpython(n);//Переключаем процессы Python и запускаем в них скрипт
//Запускаем скрипт в НЕ блокирующем режиме
__python
import time
a=0
for i in range(10):
(4пробела)a=a+1
(4пробела)time.sleep(0.1)
print ('finished')
__end_python
}
//////////////
int time=gettime();//Засекаем время
new int rez[Kol_Process];
int t=0;
string CheckAPython;
loop()//Замкнутый цикл в котором проверяем ответы от Python
{
for (n=0; n<Kol_Process; n++)//Перечисляем запущенные процессы Python
{
selectpython(n);//Переключаем процессы Python
if (getpython()=="finished")//Проверяем ответы от Python когда закончит
{
//messagebox ("Python "+format (n)+" закончил = "+sendgetpython("print (a)")); //Сообщение когда заканчивают. Может быть по разному кто первый
rez[t]=formatsn(sendgetpython("print (a)"));//Записываем полученный результат (в данном случае переменную a Python)
t++;//Увеличиваем счетчик отработанных процессов Python
if (t==Kol_Process) goto ex;//Если отработали все процессы выходим с цикла
}
}
sleep(10);
}
ex:;
string S="";
for (n=0; n<Kol_Process; n++)
{
S=S+"Python "+format(n)+" закончил = " + format(rez[0])+"^r^n";
}
S=S+"Всего было "+format(10*Kol_Process)+" операций с задержкой между ними в 0.1 секунду^r^n";
S=S+"Затрачено времени "+format(gettime()-time)+" мсек";
messagebox (S);
closepython();//Завершием работу всех процессов Python
er:;
disableconsolepython();
Запуск одного процесса который делает всю работу сам (Отобразить) Цитата: enableconsolepython(1, 1, 50, 50, 800, 200);
//Запускаем процесс Python
if (runpython()==0){messagebox ("Не удалось запустить Python"); goto er;}
//Запускаем скрипт в НЕ блокирующем режиме
__python
import time
a=0
for i in range(200):
(4пробела)a=a+1
(4пробела)time.sleep(0.1)
print ('finished')
__end_python
}
//////////////
int time=gettime();//Засекаем время
int rez;
string CheckAPython;
loop()//Замкнутый цикл в котором проверяем ответы от Python
{
if (getpython()=="finished")//Проверяем ответы от Python когда закончит
{
//messagebox ("Python "+format (n)+" закончил = "+sendgetpython("print (a)")); //Сообщение когда заканчивают. Может быть по разному кто первый
rez=formatsn(sendgetpython("print (a)"));//Записываем полученный результат (в данном случае переменную a Python)
goto ex;//Если отработали два процесса выходим с цикла
}
sleep(100);
}
ex:;
string S="";
S=S+"Python закончил = " + format(rez)+"^r^n";
S=S+"Всего было 200 операций с задержкой между ними в 0.1 секунду^r^n";
S=S+"Затрачено времени "+format(gettime()-time)+" мсек";
messagebox (S);
closepython();//Завершием работу всех процессов Python
er:;
disableconsolepython();
|