Управление потоками на PERL
Входные данные:
• $user
• $pass
• $host
• $dbname – имя базы данных
• $table_name – имя таблицы с данными
• $threads – количество процессов
• $limit – количество копируемых строк в рабочую таблицу ($table_name_$ident_tmp)
• $ident – идентификатор сессии (если не установлен то равен Unix-time)
• переменные задаются ключами: (-u root –host localhost –limit 10 …)
1. скопировать данные из таблицы $table_name в $table_name_$ident
2. скопировать в таблицу $table_name_$ident_tmp заданное количество строк ($limit) из $table_name_$ident
3. запустить потоки + записать их id,pid и время запуска во временную таблицу $table_name_$ident_th (потоки сами прописывают себя)
Потоки:
а. выбрать строку данных из таблицы $table_name_$ident_tmp где status=”not fetch”
б. в таблице $table_name_$ident_tmp поставить status="in_progress" + taken_by=”id”
в. Вернуть массив данных (@row)
г. в таблице $table_name_$ident_tmp поставить status="fetched" для той строки что мы выбрали ранее
(обращаемся по id выбранной строки – т.е. по значению первого элемента + проверяем что именно этот процесс ранее выбирал эту строку
пример: update $table_name_$ident_tmp set status=’fetched’ where id=$row[0] and taken_by=$id)
5. Если потоку нечего делать то
а. он блокирует таблицу с информацией о потоках $table_name_$ident_th и убивает по значению pid всех кроме себя
б. делает апдейт таблицы $table_name_$ident по значению id-строки меняет статусы, время обращения и id-процесса.
в. Удаляет таблицу $table_name_$ident_tmp
г. Далее в П.1 или
6. Если инициатор не может выбрать строки то ВЫХОД.