Запись в один файл из разных скриптов.

Страницы: 1
RSS
Запись в один файл из разных скриптов.
 
Возможна ли корректная запись из разных скриптов в один файл?
Запускаю два скрипта:
Код
function main()
    local f = io.open(file, "a+")
    for i = 1, 100 do
      f:write(s..i.."\n")
      f:flush()
      sleep(1)
    end
    f:close()
end
В первом: s = ".."
во втором: s = "+"

В файле
Скрытый текст
часть строк теряются.

Есть идеи как исправить?
 
а) устанавливать флаг "захвата шины" б) закрывать файл после каждой записи в) объединять файлы после окончания работы скриптов г) использовать один скрипт вместо двух.
 
Перед записью проверьте, можете ли вы открыть файл для записи, не занят ли он другим процессом.
Код
    f = io.open(file,"+a");
   i = 0;
   while(f == nil) do
       i = i + 1;
      if i == 2000 then
         message("Не могу открыть для записи файл "..file);
            sleep(5000);
            error("");
      end;            
            f = io.open(file,"+a");
       sleep(1);
   end;
 
Lua всегда открывает файлы в разделяемом режиме.

поэтому любые идеи типа открытия в режиме дописывания и прочее не помогут.

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

но лучше использовать механизмы мютексов или что то в этом роде, Но это уже с++.

а ещё лучше пересмотреть логику скриптов, чтобы писать из одного скрипта
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Незнайка написал:
Возможна ли корректная запись из разных скриптов в один файл?
Запускаю два скрипта:
Код
   function   main ()
     local  f  =   io.open (file,  "a+" )
     for  i  =   1 ,  100   do 
      f:write(s .. i .. "\n")
      f:flush()
       sleep ( 1 )
     end 
    f:close()
 end   
В первом: s = ".."
во втором: s = "+"

В файле
    Скрытый текст        
Цитата
..1
..2
..3
..4
..5
+1
..6
..7
+4
..8
+5
..9
+6
..10
..11
..12
+9

..14
+10
..15
+11
..16
..17
..18
+15
..19
..20
+16
..21
+18
..22
+19
..23
+20
..24
+21

+22
часть строк теряются.

Есть идеи как исправить?
попробуйте сначала сформировать все что хотите записать в виде строки
а потом запишите это в файл одним обращением.  При этом рекомендую ставить метку времени в каждой записи.
 
Цитата
Владимир написал:
закрывать файл после каждой записи
И что это даст?

Цитата
Владимир написал:
объединять файлы после окончания работы скриптов
Исключено: файл должен заполняться реалтайм.

Цитата
Владимир написал:
использовать один скрипт вместо двух
На самом деле их не два. Объединять скрипты не планирую.
 
Цитата
s_mike@rambler.ru написал:
правильный путь - это формирование флага. Например, если один скрипт хочет писать, он пробует создать папку-семафор на диске. Если папка создалась удачно, дописывает файл. Если при создании папки была ошибка (папка существует), то надо подождать. По окончании записи нужно закрыть файл и удалить папку.
В Lua есть штатные средства создания папки?
Если только создавать файл-флаг. Но это не поможет: несколько скриптов увидят, что флага нет и начнут запись одновременно. Результат будет тот же.

Цитата
s_mike@rambler.ru написал:
использовать механизмы мютексов или что то в этом роде, Но это уже с++
Для торговых ботов использую только QLua.
Если только Арка когда-нибудь сделает мютексы. Но рассчитывать, что это произойдёт в ближайшем будущем я бы не стал.

Цитата
s_mike@rambler.ru написал:
а ещё лучше пересмотреть логику скриптов, чтобы писать из одного скрипта
У каждого скрипта свои данные, которые он пишет в общий файл. Если вести запись только из одного скрипта, то другие скрипты должны будут ему эти данные передать. По сути это будет та же самая задача - обмен данным между скриптами.
 
Если писать только внутри колбеков, то в пределах одного квика запись в один файл из разных скриптов корректна.
Из разных квиков пока не придумал, как сделать.
 
Незнайка, Тогда страдайте. :smile:

В очередь, суки, в очередь!(с)
Каждый скрипт, который хочет что-то записать, подаёт заявку, его айдишка попадает в циклическую очередь (по хвосту). Диспетчер берёт очередную айдишку (по голове), и выставляет разрешение для этого скрипта писать. По окончанию записи айдишка сбрасывается, и это сигнал диспетчеру забрать очередной элемент из очереди, если он там есть.

А вообще я свято убеждён: использовать более одного скрипта есть дурь несусветная - это не принесёт ничего, кроме головной боли.
 
Цитата
Владимир написал:
Незнайка, Тогда страдайте. ::

В очередь, суки, в очередь!(с)
Каждый скрипт, который хочет что-то записать, подаёт заявку, его айдишка попадает в циклическую очередь (по хвосту). Диспетчер берёт очередную айдишку (по голове), и выставляет разрешение для этого скрипта писать. По окончанию записи айдишка сбрасывается, и это сигнал диспетчеру забрать очередной элемент из очереди, если он там есть.

А вообще я свято убеждён: использовать более одного скрипта есть дурь несусветная - это не принесёт ничего, кроме головной боли.
ну видимо  действительно  проще уменьшить количество скрипьов как написал Владимир .

 Ну если уж совсем не хочется , то  может стоит  им  время каждому свое установить ?  Сколько там у вас уходит максимально  времени на одну запись :  секунда или миллисекунда  ? Предположим у вас 3 скрипта  и  разделите время   по типу :  "" на первый -третий рассчитайсь !!!!  и тогда каждый скрип будет только в свое время отправлять запись если она есть а остальные скрипты в этот момент   будут ждать своего времени.  
 
Чтобы обмениваться данными между скриптами есть достаточно средств, помимо файлов есть и решения через память:

раз: https://quik2dde.ru/viewtopic.php?id=61
два: https://quik2dde.ru/viewtopic.php?id=306

И это не считая методик через socket.

Категорично говорить, что это не надо не стоит. Простой пример - передать данные из скрипта в индикатор.
 
Nikolay, Так у меня нет никаких индикаторов. Нет, не было и не будет. :smile: Ну, а если и в самом деле "есть и решения через память", то только так и нужно работать. В моё время это называлось "ОЗУ двойного доступа".
 
Как вариант, каждый скрипт пишет в свой файл с указанием времени записи, а один из скриптов отслеживает изменения этих файлов и обновляет единый файл сортируя записи по времени.
Страницы: 1
Читают тему
Наверх