LINUX.ORG.RU

Bash Несколько потоков, один документ

 


0

4

Есть скрипт который запускается в несколько потоков и обрабатывает один документ, как сделать чтобы поток считывал строчку с документа и удалял её сразу, что бы другие потоки уже не работали с этой строчкой, спасибо

Я думаю, вы уже нагуглили варианты удаления строк из файла, но по какой-то причине они вам не подошли.
Поэтому предлагаю начать сначала - что за файл, что за скрипт, на каком языке, переоткрывается ли файл каждый раз на новую строчку, как контролируется race condition итп

zolden ★★★★★
()
Последнее исправление: zolden (всего исправлений: 1)
Ответ на: комментарий от zolden

Файл обычный текстовый, надо считывать по строчкам, а дальше уже скрипт работает с ней, скрипт на bash, вот я и не могу понять как это реализовать и учесть состояние гонки...

temka_g
() автор топика

сначала разбей его на части сплитом, а потом на каждый из кусков по скрипту натравивай

anonymous
()
Ответ на: комментарий от anonymous

Не катит, так один поток может завершиться намного раньше другого, скрипт работает разное время с каждой строчкой

temka_g
() автор топика

Подписался на тред потому что тоже задавался этим вопросом, но седом удалять строчки из большого (несколько гигов) файлы было крайне долго из-за постоянного копирования файла.

alozovskoy ★★★★★
()

Считаю, что в такой постановке задача нерешима.

Читай одним потоком, обрабатывай в нескольких.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от temka_g

в любом случае у тебя потоки блокируются на обновлении состояния входного файла

anonymous
()

Если скрипт вызывается отдельно для каждой строки, то gnu parallel поможет.

Psych218 ★★★★★
()

как сделать чтобы поток считывал строчку с документа и удалял её сразу, что бы другие потоки уже не работали с этой строчкой, спасибо

Как тебе уже правильно посоветовали, нужно делать не так. Нужно чтобы один скрипт читал строчку и запускал другой скрипт для обработки строчки. Первый скрипт может контролировать сколько обработчиков запущено, если это нужно. Обработчики ничего из оригинального файла не читают, они тупо обрабатывают всё, что им скормит в качестве строчки первый скрипт (диспетчер).

no-such-file ★★★★★
()

А можно как-то ждать пока файл занят другим потоком, потом как освободится продолжать работу?

temka_g
() автор топика
Ответ на: комментарий от temka_g

А можно как-то увидеть описание изначальной задачи, вместо раздумий о величине и форме колёс, придуманного для её решения велосипеда?

zolden ★★★★★
()
Ответ на: комментарий от zolden

Хорошо, вот: У меня есть файл с серверами

root@ip1
root@ip2
...

Есть файл с нужными данными, которые надо обрабатывать по строчно. я собирался запускать для каждого сервера отдельный поток, который уже считывал строчку и отправлял выполнение третьего скрипта с этой строчкой на мой сервер1, второй поток отправлял след строчку на сервер2. Т.е примерно так: есть скрипт1

читаем файл с серверами и для каждого  $сервера через & запускаем скрипт2 $сервер (скрипт на нашей же машине)

потом скрипт2

читает строчку из нашего рабочего файла и запускает через ssh скрипт3 с этой строчкой на удаленной машине. причем запускает k потоков, потом ждет завершения одного и читает след строку и тд. И этот скрипт выполняется паралельно для каждого параметра $сервер

temka_g
() автор топика
Ответ на: комментарий от temka_g

Не сложновато для баша? Хочешь быстро — возьми что нибудь побыстрее. Хочешь просто — пользуй баш в один поток)

kardapoltsev ★★★★★
()

Как тебе выше писали, сделай скрипт диспетчер, и пусть он раздаёт задания. Но задания я бы хранил не в едином документе списком строк, а в каталоге списком файлов, где одно задание — один файл с одной строкой. Прогресс выполнения делать через переименование файлов заданий.

$ ls -1
task_0001.working.done
task_0002.working.done
task_0003.working
task_0004.working
task_0005.working
task_0006
task_0007
task_0008
task_0009

justAmoment ★★★★★
()

в несколько потоков

смысл? /dev/sda у тебя одно, делай в один поток.

emulek
()

Есть скрипт который запускается в несколько потоков и обрабатывает один документ, как сделать чтобы поток считывал строчку с документа и удалял её сразу, что бы другие потоки уже не работали с этой строчкой, спасибо

И чем больше файл - тем дольше ждём удаления этой строчки и пересохранения файла.

Вот пример, писал на коленке, читает из файла строки и запускает по ${max_parallel_workers} параллельных потоков с обработкой этих строк. Ждёт пока все эти ${max_parallel_workers} завершатся и запускает снова.

#!/bin/bash

#запоминаем разделители ввода/вывода
OLD_IFS=${IFS}

#будем читать файл построчно
IFS=$'\n'

#наш огромный текстовый файл с данными
data_file="./big_text_file"

#сколько параллельных задач будем запускать
max_parallel_workers=10

#то, что будет выполнять какие-либо действия
worker()
{
 echo "worker №{$1}: start"

# "долго выполняющиеся" действия
 sleep 2s

 echo "worker №{$1}: done"
}

#счетчик запущенных параллельных процессов
nn=0

#читаем данные из файла и обрабатываем
for str in `cat ${data_file}`; do

#запускаем обработку данных, функция из текущего файла-скрипта, либюо внешний скрипт
 ( worker ${nn} ${str} ) &

# если достигнут максимум параллельных процессов - ожидаем завершения ВСЕХ запущенных
 nn=$[nn+1]
 if [ ${nn} -eq ${max_parallel_workers} ]; then
  nn=0
  wait
 fi

done

#ждём завершения оставшихся параллельных процессов
wait

#восстанавливаем разделители ввода/вывода
IFS=${OLD_IFS}
DiMoN ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.