2016-10-06 5 views
0
import threading 


def read_file(): 
    f = open('text.txt') 
    for line in f: 
     print line.strip() ,' : ', threading.current_thread().getName() 

if __name__ == '__main__': 
    threads = [] 
    for i in range(15): 
    t = threading.Thread(target=read_file) 
    threads.append(t) 
    t.start() 

Вопрос: Будет ли каждый поток читать каждую строку только один раз из файла выше или есть вероятность, что данный поток может в конечном итоге прочитать строку дважды?Многопотоковый файл read python

Насколько я понимаю, потоки, запущенные позже, перезаписывают дескриптор файла для начатого потока, в результате чего более ранний поток заканчивается чтением нескольких строк дважды или три раза или более раз.

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

Любые объяснения приветствуются.

+1

Каков был результат, когда вы запускали программу? Вы заметили, как какие-то демоны вылетают из вашего носа? :) –

ответ

7

Каждый поток выполняет вашу функцию независимо; каждая копия функции открывает файл как локальный, который не является общим. Каждый объект файла Python отслеживает состояние считывания полностью независимо; каждый из них имеет свой собственный дескриптор файла уровня ОС.

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

+0

Но почему каждый поток выполняет функцию независимо? Это тот же объект функции, который передается каждому потоку. Итак, как каждый поток может открыть файл как локальный? – abc

+3

@abc: да, вы передаете функцию * object *. Таким образом, поток запускается и * в этом потоке * функция на самом деле * называется *. Когда функция вызывается, создается новый фрейм со структурой их собственных локалей. Каждый поток вызывает функцию отдельно, каждый поток получает свой собственный функциональный фрейм, и каждый кадр функции имеет локальные. Эти местные жители полностью независимы. –

 Смежные вопросы

  • Нет связанных вопросов^_^