Программирование > Perl
многопроточность в perl
demond:
проблема в следующем: скрипт получает на вход текстовый файл и кол-во потоков, далее каждый поток читаем из файла строчку (файл большой n*100000 записей, поэтому построчно) и пишет в другой (тоже один и тотже для всех потоков) файл. при этом происходит то ли затирание записей в выходном файле, то ли во время чтения происходит считывание не всей строчки (в результате проведенных опытов, решено что проблема в чтении).
Посути происходит много поточное переписывание из одного файла в другой (для 1-го потока все работает номально)
Как можно избежать такого? предполагаю, что надо поставить блокировку на файл из которого происходит чтение, но только не понимаю как это сделать!
#!/usr/bin/perl
use strict;
use threads;
use threads::shared;
my $j = 0;
share $j;# делаем переменную общую для всех потоков
my $n=1; #для создания потоков
my $num_threads = shift || 3; # кол-во потоков
my $path = shift || \'text.txt\';
my @threads;# будет содержать ссылки на потоки, для одновременного их запуска
# открываем файл
open(INPATH,"$path") || die "Can\'t open $path: $!";
# открываем файл для записи результатов
open(OUTPATH,"+
ravshaniy:
Многопоточное переписывание одного файла в другой ).
А конечный файл должен быть копией исходного?
Объясняю свой вопрос: без блокировки у Вас в конечном файле получится каламбур скорее всего.
С блокировкой: скорее всего информация в файле умножется на количество процессов. и каждый последующий процесс будет записывать тоже самое что и предыдущей, но после снятия блокировки
Что вы хотите сделать?
Скопировать файл. но разбить копирование на несколько потоков? или что?
/*по некоторым причинам мне кажется будет работать так, если я не прав прошу обязательно написать мне*/
demond:
Задача конечно глобальнее, чем просто копирование файлов! Но любую сложную задачу имеет смысл разбить на несколько простых. Вот это одна из простых задач!(в оригинале каждый поток кроме чтения еще производит манипуляции с прочитанной информацией).
Проблема не с записью!!! (я пробовал записывать в расшаренную переменную, а потом из нее переписывать в файл, результат тот же, кроме того каламбура не будет в выходном файле, потому что при каждой операции записи происходт сдвиг указателя в файле, и каждый поток пишит в новое место)
Проблема с чтением информации из входного файла. Весь я его прочитать в память не могу, слишком большой. А проблему я себе представляю следующим образом: при чтении из файла, если строка еще полностью не прочитана и происходит переключение контекста (управление получает другой процесс), то ни первый ни второй потоки не смогут нормально обрабатывать считанную информацию, т.к. она не полная. Как этого избежать не знаю! надо как-то не давать читать из файла, если эту операцию выполнял другой проток и не закончил ее до переключения контекста.
ravshaniy:
--- Цитировать ---demond:
я пробовал записывать в расшаренную переменную, а потом из нее переписывать в файл, результат тот же, кроме того каламбура не будет в выходном файле, потому что при каждой операции записи происходт сдвиг указателя в файле, и каждый поток пишит в новое место
--- Конец цитаты ---
а читает поток - сдвигает указатель? а есть гарантия того что следующий поток читающий будет соответсвовать следующиму пишущему? поэтому мне кажется может получится каламбур
demond:
--- Цитировать ---ravshaniy:
а есть гарантия того что следующий поток читающий будет соответсвовать следующиму пишущему?
--- Конец цитаты ---
а нет никакой разницы в каком порядке они будут писать. главное чтобы были прочитаны и записаны все строки.
Есть мысль попробовать читать в массив несколько строк(по числу потоков) и в последствии каждому потоку выдавать свою строку. Только вот если какой-то из потоков задержится с манипуляцией над своей строкой, остальным прийдется его ждать, а этого не хотелось бы!
А вот как создать каждому потоку свой сектор, я что-то не представляю.
а в бд перейти это мысль! спасибо!
Навигация
Перейти к полной версии