Найти - Пользователи
Полная версия: Многопоточность работа с файлами.
Начало » Python для новичков » Многопоточность работа с файлами.
1
ptax
Суть задачи такая. Есть файл, с которого берется строчка и сразу удаляется, если условие не выполнено строка возвращается.
При работе в один поток все хорошо. Проблема возникает при многопточность один поток успевает быстро удалит файл а второй естественно не может его открыть. Как реализовать правильно работу с такой вот логикой ?
Заранее извиняюсь за свой быдлокод и за сумбурность текста .



THREADS = 10      # количество потоков
KOLICESTVO = 10 #Количество повторений
queue = Queue.Queue()

#---------------------------------------
def stroka_del(filename): # Функция которая берет строчку из файла и удаляет её
stroki = open(filename).readlines()
stroka = stroki[0]
del stroki[0]
os.remove(filename)
for i in stroki:
zap = ('{0}\n').format(i.strip())
f3 = open(filename, "a")
f3.write (zap)
f3.close()
return stroka

def stroka_vozvrat(filename,stroka): # функция которая возврашаят строку
zap = ('{0}\n').format(stroka.strip())
f3 = open(filename, "a")
f3.write (zap)
f3.close()

put_file = (r'E:\test.txt')

def test():
text = 'Тестовое сообщение' # какойто текст
if text:
stroka = stroka_del(put_file) # удаляем строку
print stroka
else:
stroka_vozvrat(put_file,stroka) # если текст не найден то возврашаем строку



def repeat():
while True:
try:
item = queue.get_nowait() # ждём данные
except Queue.Empty:
break
test()
time.sleep(0.5)
queue.task_done() # задача завершена
def main():
for i in xrange(KOLICESTVO):
queue.put(i) # заносим данные в очередь
for i in xrange(THREADS):
t = threading.Thread(target=repeat) # создаем нить
t.start() # стартуем
time.sleep(0.5)
queue.join()
print "Done"
if __name__ == '__main__':
main()
Андрей Светлов
Лучше плохой код, чем совсем никакого.

А что делает функция test? У нее условие всегда срабатывает.
И еще. Попытайтесь словами описать, что вы хотите сотворить с вашим файлом.
Совершенно непонятен смысл манипуляций. Вдвойне неясно, зачем делать это в несколько потоков.
Soteric
Не совсем понятно какой выигрыш здесь можно получить от многопоточности, если вся суть операции сводится к редактированию одного и того же файла. Если один поток работает с файлом, то очевидно, что всем остальным придется ждать момента когда файл освободится.

Чтобы заблокировать файл (или другой общий ресурс) необходимо применить Lock.
lock = Lock()

def test():
with lock:
text = 'Тестовое сообщение' # какойто текст
if text:
stroka = stroka_del(put_file) # удаляем строку
print stroka
else:
stroka_vozvrat(put_file,stroka) # если текст не найден то возврашаем строкуp
Все остальные потоки дойдя до ‘with lock:’ остановятся и будут ждать когда занявший файл поток покинет этот участок кода. Я может быть что-то не понял, но при такой ситуации этот код равносилен однопоточному решению.

Пока писал пришел Светлов :)
ptax
Андрей Светлов
Лучше плохой код, чем совсем никакого.

А что делает функция test? У нее условие всегда срабатывает.
И еще. Попытайтесь словами описать, что вы хотите сотворить с вашим файлом.
Совершенно непонятен смысл манипуляций. Вдвойне неясно, зачем делать это в несколько потоков.
Функция test собственно сами действие скрипта (да срабатывает всегда). Есть какой то текст если он в нем что то находит то удаленная строка не возвращается если не чего не находит то возвращаются строка обратно файл записывается в конец. Собственно это я и хочу сделает. Вся проблема в том что когда один поток берет строку второй поток пытается тоже это сделать .
ptax
Soteric
Не совсем понятно какой выигрыш здесь можно получить от многопоточности, если вся суть операции сводится к редактированию одного и того же файла. Если один поток работает с файлом, то очевидно, что всем остальным придется ждать момента когда файл освободится.

Чтобы заблокировать файл (или другой общий ресурс) необходимо применить Lock.
lock = Lock()

def test():
with lock:
text = 'Тестовое сообщение' # какойто текст
if text:
stroka = stroka_del(put_file) # удаляем строку
print stroka
else:
stroka_vozvrat(put_file,stroka) # если текст не найден то возврашаем строкуp
Все остальные потоки дойдя до ‘with lock:’ остановятся и будут ждать когда занявший файл поток покинет этот участок кода. Я может быть что-то не понял, но при такой ситуации этот код равносилен однопоточному решению.

Пока писал пришел Светлов :)
Большое спасибо я как то не совсем понял как работать с Lock а оказывается все не так и сложно. Выигрыш есть операция не занимает много времени, в фунции по мимо работы с файлом еще много чего. Скорее я плохо продумал логику самой программы и я это знаю . но как сделать лучше пока не дорос. Еще раз спасибо
Андрей Светлов
Никогда не используйте Lock. Только RLock.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB