Что нового

Распараллеливание функций

mef-t

Осваивающий
Сообщения
306
Репутация
30
AutoIt: 3.3.14
Версия: 1.0.2

Категория: Автоматизация, Вспомогательные функции, Разное

Описание: Данная UDF помогает запустить несколько копий функций параллельно.
На текущий момент функции не могут возвращать результатов в основной скрипт.
На текущий момент в функцию нельзя передать аргументы


Т.к. autoit не поддерживает многопоточность, то данное решение просто создает несколько процессов.
Присутствуют 2 функции:
__paralelFunc_Init() - стартовая точка, после которой повторно запущенный процесс перейдет к запуску функции.
В зависимости от того, требуется ли включить библиотеки, переменные, или выполнение другого кода функция размещается или в самому начале скрипта, или несколько позже.
__paralelFunc($function, $count) - функция инициирует запуск дополнительных процессов.

Код/Пример:
Код:
#include "_paralelFunc.au3"
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <array.au3>

Global $progressbar

;~ _test()

__paralelFunc_Init()

$arr = __paralelFunc('_test', 3, 1)
_ArrayDisplay($arr)


Func _test()

	SRandom(@MSEC)

	GUICreate("Прогресс бар", 220, 50, Random(50, 350, 1), Random(100, 400, 1))
	$progressbar = GUICtrlCreateProgress(10, 10, 200, 20)
	GUISetState()
	_progressbar()
EndFunc

Func _progressbar()
	$time = TimerInit()
	For $i = 0 To 100 Step 1
		GUICtrlSetData($progressbar, $i)
		Sleep(20)
	Next
	$iDiff = TimerDiff($time)
	ConsoleWrite("Разница во времени = " & $iDiff)
EndFunc

Файл: _paralelFunc.au3

История версий:

Источник: autoit-script.ru
Автор(ы): mef-t

Дополнительно: О том, как передать аргументы, мысли есть. Чуть позже будет.
Сложнее получить результат. Просьба подсказать варианты передачи данных между процессами.

UPD:
На текущий момент добавил вывод через консоль, используя $STDOUT_CHILD.
Данные возвращаются через массив. В используемой функции возвращаемые данные нужно отправлять в консоль.
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
не много конечно, но в целом есть, можно пользоваться. Посмотрю.
На текущий момент больше думаю, как аргументы передать.
один из вариантов - использовать массив (одномерный или двумерный) аргументов.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
передавай строки аргументов, а принимающий процесс сам переведет в массив или что там нужно
пользуюсь
Код:
_WinAPI_CreateFileMapping

передает строки через общую структуру файла
более двух лет пользуюсь, косяков не было
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Да, вариант хороший, но только при обмене данными между 2мя процессами.
Когда родитель должен получить данные с множества дочерних процессов, возникают трудности.
Т.к. процессы работают одновременно, то и обмен данными тоже должен идти одновременно. А так как родитель всего один, то обмен данными будет идти последовательно. В этой ситуации один из процессов уже может закрыться.
Можно, конечно, заставить процессы ждать, но тогда какой смысл в параллельном запуске.
Тут результат правильнее записывать в некий поток, от куда потом его считывать.
Консоль - это полурешение, т.к. в консоль может быть направлены и другие тексты.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Создаешь структуру, в которой есть ячейка для каждого процесса. Процессы копируют данные каждый в свою ячейку. Основной процесс читает. Подключенных процессов может быть более одного.


Добавлено:
Сообщение автоматически объединено:

И вообще, на форуме уже были темы о псевдо многопоточности. Поищи
 

Prog

Продвинутый
Сообщения
536
Репутация
65
joiner [?]
Процессы копируют данные каждый в свою ячейку. Основной процесс читает.
А если потребуется обмен между созданными процессами?
Нет, все это даже близко не сравнится с возможностями многопоточности.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Нет, все это даже близко не сравнится с возможностями многопоточности.
Я как раз об этом и писал, упомянув псевдо многопо очность.
 
Верх