Я пытаюсь установить что-то там, где один поток пишет список работ, а другой поток читает список и работает с ним. Этот список может быть очень большим, чтобы остановить этот список в памяти. Я хочу, чтобы он был написан в файле (или в любом случае - для сохранения генераторов памяти?).Работа в очереди, без использования большого количества памяти
Я собрал немного бегущего примера со сном в писателе, чтобы читатель мог догнать. Мне интересно, как я могу заставить читателя не останавливаться, когда он «настигает» писателя. Я посмотрел на использование .seek
и .tell
, но у меня появилось странное поведение, и я не уверен, что это правильный маршрут.
Как еще один вопрос, разве это вообще разумная идея? Возможно, есть намного более элегантный способ, которым я могу поставить в очередь список строк без использования большого количества памяти.
import threading,time
class Writer(threading.Thread):
lock= threading.Lock()
def __init__(self,file_path,size):
threading.Thread.__init__(self)
self.file_path= file_path
self.size= size
self.i=0
def how_many(self):
with self.lock:
print "Reader starting, writer is on",self.i
def run(self):
f=open(self.file_path,"w")
for i in xrange(self.size):
with self.lock:
self.i=i
if i%1000==0:
time.sleep(0.1)
f.write("%s\n"%i)
f.close()
class Reader(threading.Thread):
def __init__(self,file_path):
threading.Thread.__init__(self)
self.file_path= file_path
def run(self):
f=open(self.file_path,"r")
line=0
for line in f:
pass
print "Reader got to: %s"%line.strip()
if __name__ == "__main__":
a= Writer("testfile",2000000)
b= Reader("testfile")
a.start()
time.sleep(1)
a.how_many()
b.start()
Вы заглянули в [трубы] (http://stackoverflow.com/questions/1430446/create-a-temporary-fifo-named-pipe-in-python)? –
Выглядит многообещающе, но это UNIX только правильно? Мне нужно что-то независимое от платформы – GP89
. Проверьте [здесь] (http://eli.thegreenplace.net/2011/12/27/python-threads-communication-and-stopping/) для примера рабочих потоков и очередей в python. Класс Queue.Queue обрабатывает кросс-платформу fifo. Возможно, вам придется подклассифицировать очередь для записи записей во временный файл для вашей памяти. –