Эх, не о том мну Lock (если исходить из манов) один поток может вызывать только один раз, RLock один поток может вызывать несколько раз подряд.
P.S. Насчет монструозности - мну бывает заносит, начинаю изь*бываться.
Несколько процов/ядер пох ибо это threading а не multiprocessing, параша в консоль валится это бесспорно, в принципе, сделай так (ну попиарю я WRITER )
Код:
#Класс для записи данных в несколько файлов
class WRITER:
#Атрибут инициализации
def __init__(self):
from threading import RLock
self.Lock = RLock
self.Locks = {}
self.defaultencoding = "UTF-8"
self.defaultout = u"out"
#Атрибут записи одного элемента
def write_one(self, data, id_=None, data_encoding=None):
if id_ is None:
id_ = self.defaultout
if data_encoding is None:
encoding = self.defaultencoding
if id_ not in self.Locks:
self.Locks[id_] = self.Lock()
self.Locks[id_].acquire()
with open(u"{0}.csv".format(id_).encode(self.defaultencoding), "a") as out:
print data
out.write("{0}\n".format(data.encode(encoding, "replace")))
self.Locks[id_].release()
#Атрибут записи последовательности
def write_many(self, data, id_=None, data_encoding=None):
if id_ is None:
id_ = self.defaultout
if data_encoding is None:
encoding = self.defaultencoding
if id_ not in self.Locks:
self.Locks[id_] = self.Lock()
self.Locks[id_].acquire()
with open(u"{0}.csv".format(id_).encode(self.defaultencoding), "a") as out:
for item in data:
print item
out.write("{0}\n".format(item.encode(encoding, "replace")))
self.Locks[id_].release()
Данные ему давать в юникоде )
Потом, еще раз, в той куче монструозности есть еще один класс - PROXYS, его тоже можешь глянуть, при малюсенькой корректировке им можно заменить твой скрипт (добавить только вывод в файл и вывод в консоль, замки там уже имеются). П.С. насчет критики моей ты можешь не нервничать, по большому счету мне все равно как ты напишешь своё творение, мои посты можешь рассматривать просто как ещё один возможный вариант решения своей задачи.
П.С. смотри аву - мну мудак )
P.P.S. WRITER задуман для вывода данных в несколько разных файлов, это просто мойне парашен, в стандартной поставке есть logging, назначение его в принципе другое, но его можно переделать под аналогичные задачи, а так то мне лень было с ним разбираться =/
Последний раз редактировалось login999; 15.09.2009 в 15:46..